makecw.c   [plain text]


/* 
 * 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 <pathutil.h>

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