POINT2D
getPoint2d(const POINTARRAY *pa, int n)
{
- POINT2D result;
- getPoint2d_p(pa, n, &result);
- return result;
+ const POINT2D *result;
+ result = getPoint2d_cp(pa, n);
+ return *result;
}
/*
}
-char
-ptarray_isccw(const POINTARRAY *pa)
-{
- int i;
- double area = 0;
- POINT2D p1, p2, p0;
-
- if ( pa->npoints == 0 ) return 0;
-
- getPoint2d_p(pa, 0, &p1);
- p0 = p1;
- p1.x -= p0.x; p1.y -= p0.y;
- for (i=0; i<pa->npoints-1; i++)
- {
- getPoint2d_p(pa, i+1, &p2);
- p2.x -= p0.x; p2.y -= p0.y;
- area += (p1.y * p2.x) - (p1.x * p2.y);
- p1 = p2;
- }
- /* lwnotice("Signed area: %.16g", area); */
- if ( area > 0 ) return 0;
- else return 1;
-}
-
/**
* Given a string with at least 2 chars in it, convert them to
* a byte value. No error checking done!
return sum / 2.0;
}
+int
+ptarray_isccw(const POINTARRAY *pa)
+{
+ double area = 0;
+ area = ptarray_signed_area(pa);
+ if ( area > 0 ) return LW_FALSE;
+ else return LW_TRUE;
+}
+
POINTARRAY*
ptarray_force_dims(const POINTARRAY *pa, int hasz, int hasm)
{
{
double dist = 0.0;
int i;
- POINT2D frm;
- POINT2D to;
+ const POINT2D *frm;
+ const POINT2D *to;
if ( pts->npoints < 2 ) return 0.0;
- for (i=0; i<pts->npoints-1; i++)
+
+ frm = getPoint2d_cp(pts, 0);
+
+ for ( i=1; i < pts->npoints; i++ )
{
- getPoint2d_p(pts, i, &frm);
- getPoint2d_p(pts, i+1, &to);
- dist += sqrt( ( (frm.x - to.x)*(frm.x - to.x) ) +
- ((frm.y - to.y)*(frm.y - to.y) ) );
+ to = getPoint2d_cp(pts, i);
+
+ dist += sqrt( ((frm->x - to->x)*(frm->x - to->x)) +
+ ((frm->y - to->y)*(frm->y - to->y)) );
+
+ frm = to;
}
return dist;
}
/* compute 2d length if 3d is not available */
if ( ! FLAGS_GET_Z(pts->flags) ) return ptarray_length_2d(pts);
- for (i=0; i<pts->npoints-1; i++)
+ getPoint3dz_p(pts, 0, &frm);
+ for ( i=1; i < pts->npoints; i++ )
{
- getPoint3dz_p(pts, i, &frm);
getPoint3dz_p(pts, i+1, &to);
- dist += sqrt( ( (frm.x - to.x)*(frm.x - to.x) ) +
- ((frm.y - to.y)*(frm.y - to.y) ) +
- ((frm.z - to.z)*(frm.z - to.z) ) );
+ dist += sqrt( ((frm.x - to.x)*(frm.x - to.x)) +
+ ((frm.y - to.y)*(frm.y - to.y)) +
+ ((frm.z - to.z)*(frm.z - to.z)) );
+ frm = to;
}
return dist;
}