Cómo complementar el código fuente del algoritmo
{ int yUpper
float xIntersect, dxPerScan
struct tEdge * next
} borde;
void Insertar borde(borde * borde de lista * borde)//Inserte el nodo en la tabla de borde.
{
Borde *p, * q = lista
p = q-> null)
{ if(edge-& gt; xIntersect & ltp->; xIntersect)p = NULL
else { q = p = p-& gt ;Siguiente; ;}
}
Borde->;siguiente = q->Siguiente;
q->;siguiente = borde
p>}
Int y next (int k, int CNT, dcpt * pts)//Encuentra el punto singular.
{
int j;
si ((k+1)>(CNT-1))j = 0;
else j = k+1;
mientras (pts[k].y==pts[j].y)
if((j+1)>(CNT-1 ))j = 0;
else j++;
return (pts[j].y
}
Nulo makegerec); (dcpt lower, dcpt lower, intycomp, edge * edge, edge * edge[]) // Genera nodos de tabla de borde e insértalos en la tabla de borde.
{
Edge->;dxPerScan =(float)(superior. x-inferior. x)/(superior. y-inferior. y);
borde->xIntersect = inferior.x
if(superior . y <yComp)
borde->yUpper = superior .y-1;
Otro
Borde->; yUpper = superior.y
insertEdge(edges[lower.y], borde);
}
Voidbuildedgelist (intcnt, dcpt * pts, edge * edge[])//Función principal para crear una tabla de borde.
{
borde*borde;
dcPt v1, v2;
int i, yPrev=pts[cnt-2]. y;
v1.x=pts[cnt-1]. x;v1.y=pts[cnt-1].
y;
for(I = 0;i<cnti++)
{ v2 = pts[I];
if (v1.y!=v2. y)
{ Edge =(Edge *)malloc(sizeof(Edge));
if(v 1 . y & lt; v2.y)
makeEdgeRec (v1, v2, yNext(i, cnt, pts), borde, bordes
else makeEdgeRec(v2, v1, yPrev, borde, bordes
}
p>
yPrev = v 1 .
v 1 = v2;
}
}
Vid buildactivelist ( int scan, edge * active, edge * edge[])//Función de tema que construye la tabla de borde activa.
{ Borde *p, *q;
p = borde[escanear]-> >{ q = p-& gt;
insertEdge(activo, p
p = q
}
}
Escaneo de relleno vacío (escaneo int, borde * activo)//Rellena un par de puntos de intersección.
{
Borde *p1, *p2
int i
p 1 = actividad->;
mientras(p1)
{
p2 = p 1->; siguiente
para(I = p 1->; xIntersect i<p2- >xIntersecti++)
setPixel((int)i,scan);
p1=p2->siguiente;
} p>
}
void Delete after(edge * q)//Elimina el nodo en la lista vinculada.
{
borde * p = q-& gt; siguiente
q->;
q-> p>
Free(p);
}
Void updateactivelist (int scan, edge * active)//Actualiza la tabla perimetral activa después de completarla .
{
Borde *q=activo, *p = activo-> siguiente;
mientras (p)
if( escanear>=p->yUpper)
{
p = p->Siguiente;
eliminar después de(q); }
Otro
{ p->; xIntersect = p-& gt; xIntersect+p-& gt; >
p = p-& gt;Siguiente;
}
}
resolución de vacíos (borde * activo)//Reordenar borde activo nodos de la tabla.
{
Borde *q, *p = activo->siguiente;
Activo->siguiente = NULL
mientras(p )
{ q = p-& gt; siguiente;
insertEdge(activo, p);
p = q;
insertEdge(active, p);
p = q;
p>}
}
Scanfill vacío (intcnt, dcpt * pts)//Programa principal de relleno de polígonos
{
Edge *edge[WINDOW_HEIGHT], *active
int i, scan
for(I = 0; i< window_height; i++)
{
bordes[I]=(Edge *)malloc(sizeof(Edge));
Bordes[I]-& gt; next = NULL
}
buildEdgeList(cnt, pts, bordes);
active =(Edge *)malloc( sizeof(Edge));
Actividad->;next = NULL
for(scan = 0; scan & lt window_height; scan++)
{ p>
buildActiveList(scan, active, edge);
p>
if(active->siguiente)
{fillScan(sacn,active);<br />updateActiveList(escanear,activo);<br/>resortActiveList(activo );<br/>;}
}
}
}
}
} p>