Red de conocimiento informático - Conocimiento de la instalación - Ayuda: ¿Alguien tiene el código fuente del algoritmo de llenado de líneas de escaneo poligonal en C++?

Ayuda: ¿Alguien tiene el código fuente del algoritmo de llenado de líneas de escaneo poligonal en C++?

typedef struct tEdge

{ int yUpper;

float xIntersect,dxPerScan;

struct tEdge *next;

}Edge;

} 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 xIntersect) p=NULL;

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>

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;

}

}

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);

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 );
}

}

}

}

}

}

}

}

}