Ayuda: ¿Alguien tiene el código fuente del algoritmo de llenado de líneas de escaneo poligonal en C++?
{ int yUpper;
float xIntersect,dxPerScan;
struct tEdge *next;
}Edge; p>
} p>
void insertEdge (Edge *list Edge *edge)//Insertar nodo en la tabla de bordes
{
Edge *p,*q= lista;
p=q->siguiente;
while (p!=NULL)
{ if (edge->xIntersect else { q=p; p=p->siguiente;} } borde->siguiente=q->siguiente; q->next=edge; } int yNext(int k,int cnt, dcPt *pts)//encontrar singularidades { int j; if ((k+1)>(cnt-1)) j=0; else j=k+1 ; while (pts[k].y==pts[j].y) if ((j+1)>(cnt-1 )) j=0; else j++; return (pts[j].y); } void makeEdgeRec (dcPt lower,dcPt lower ,int yComp, Edge *edge, Edge *edges[]) // Genera nodos de tabla de borde e insértalos en la tabla de borde { edge- >dxPerScan=(float) (upper. borde->xIntersect=lower.x; if (upper.y borde-> yUpper=superior.y- 1; else borde->yUpper=superior.y; insertEdge(bordes[inferior.y],borde) ; } void buildEdgeList(int cnt,dcPt *pts, Edge *edges[])//Función de cuerpo que crea una lista de bordes { Borde *edge; dcPt v1,v2; int i,yPrev=pts[cnt-2].y; v1.x=pts[ cnt-1].x; v1.y=pts[cnt-1].y; para (i=0;i { v2=pts [i]; if (v1.y!=v2.y) { borde=(Borde *)malloc(sizeof(Borde)); if (v1.y if (v1.y=pts[cnt-1].x;v1.y=pts[cnt-1]. y) mientras (p) { q=p->siguiente; insertEdge(activo,p); p=q; } } void fillScan(int scan,Edge *active)//rellena un par de intersecciones { Edge *p1,*p2; p> p> int i p1=activo->siguiente; mientras(p1) { p2 =p1 ->siguiente; for (i=p1- >xIntersect;i setPixel((int)i,scan); p1=p2->next; } } void delectAfter(Edge *q)//eliminar nodo en un enlace lista { Borde *p=q->siguiente; q->siguiente=p->siguiente; gratis (p ); } void updateActiveList(int scan,Edge *active)//Actualiza la tabla perimetral activa después de completarla { Edge *q=active,*p=active-> next; while (p) if (scan> ; =p->yUpper) { p=p->siguiente; eliminarDespués(q); } más { p->xIntersect=p->xIntersect+p-& gt;dxPerScan; q=p; p=p->siguiente; p> } } void resortActiveList(Edge *active)//Reordenar los nodos activos de la tabla perimetral { Borde * q,*p=activo->siguiente; activo->siguiente=NULL; mientras(p) { q=p- >siguiente; insertarBorde(activo,p); p=q; } } void scanFill (int cnt,dcPt *pts)//programa principal de relleno de polígonos { Edge *edge[WINDOW_HEIGHT],*active; int i,escanear ; para (i=0;i { bordes[i]=(Edge *)malloc(sizeof (Borde) ); bordes[i]->next=NULL; } p> buildEdgeList(cnt,pts,edges); p> active=(Edge *)malloc (sizeof(Edge)); > activo->siguiente=NULL; for(scan=0;escanear< WINDOW_HEIGHT;scan++) { buildActiveList(escanear,activo, bordes) ; if (active->siguiente) {fillScan(sacn,active);< ;br/>updateActiveList(scan,active); } } } } } } } }
resortActiveList (activo );
}