home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
gdead.berkeley.edu
/
gdead.berkeley.edu.tar
/
gdead.berkeley.edu
/
pub
/
cad-tools
/
ciftomann.tar
/
edger_dir
/
proc_polygon.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-01-28
|
2KB
|
106 lines
#include "parser.h"
#include "ciftomann.h"
#define EdgeType(first,last) ( first->x == last->x ? \
( first->y == last->y ? IDENTICAL : VERTICAL ) :\
( first->y == last->y ? HORIZONTAL : NON_MANHATTEN ) )
#define MAXEDGES 128
#define HORIZONTAL 0
#define VERTICAL 1
#define IDENTICAL 2
#define NON_MANHATTEN 3
EDGE EdgeArray[MAXEDGES];
int NumEdges;
int ArrayIndex;
int comparer();
proc_polygon(path)
point *path;
{
NumEdges = 0;
ArrayIndex = 0;
if ( BuildList(path) == ERROR || NumEdges < 2)
return(ERROR);
qsort(EdgeArray,NumEdges,sizeof(EDGE),comparer);
#ifdef DEBUG
{
int i;
for (i=0;i<NumEdges;i++)
fprintf(stderr,"%d,%d at %d : sense = %d\n",EdgeArray[i].x,
EdgeArray[i].xend, EdgeArray[i].y,EdgeArray[i].sense);
}
#endif
edge_polygon();
return(GOOD);
}
BuildList(path)
point *path;
{
point *first,*last;
last = first = path;
while (path->next != 0) {
path = path->next;
if (CheckAsEdge(last,path) == ERROR)
return(ERROR);
last = path;
}
if (CheckAsEdge(last,first) == ERROR)
return(ERROR);
return(GOOD);
}
CheckAsEdge(last,next)
point *last,*next;
{
switch ( EdgeType(last,next) ) {
case HORIZONTAL :
EdgeArray[NumEdges].y = last->y;
if (last->x < next->x) {
EdgeArray[NumEdges].sense = 1;
EdgeArray[NumEdges].x = last->x;
EdgeArray[NumEdges].xend = next->x;
}
else {
EdgeArray[NumEdges].sense = -1;
EdgeArray[NumEdges].x = next->x;
EdgeArray[NumEdges].xend = last->x;
}
NumEdges++;
break;
case VERTICAL :
case IDENTICAL :
break;
case NON_MANHATTEN :
error("Non-Manhatten edge in polygon at (%d,%d)\n",next->x,next->y);
return(ERROR);
}
return(GOOD);
}