/*
* Force the vertices of a polygon to be in CW order.
*
* Works for polygons with concavities.
* Does not work for twisted polygons.
*
* ellson@graphviz.org October 2nd, 1996
*/
#include
void
make_CW (Ppoly_t *poly)
{
int i, j, n;
Ppoint_t *P;
Ppoint_t tP;
double area=0.0;
P = poly->ps;
n = poly->pn;
/* points or lines don't have a rotation */
if (n > 2) {
/* check CW or CCW by computing (twice the) area of poly */
for (i=1; i < n-1; i++) {
area += area2(P[0], P[i+1], P[i]);
}
/* if the area is -ve then the rotation needs to be reversed */
/* the starting point is left unchanged */
if (area < 0.0) {
for (i = 1, j = n-1; i < 1+n/2; i++, j--) {
tP = P[i];
P[i] = P[j];
P[j] = tP;
}
}
}
}