]> granicus.if.org Git - postgis/commitdiff
Reorganize some pointarray loops and functions. Use direct aligned access more.
authorPaul Ramsey <pramsey@cleverelephant.ca>
Thu, 25 Oct 2012 19:29:34 +0000 (19:29 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Thu, 25 Oct 2012 19:29:34 +0000 (19:29 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@10564 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom_internal.h
liblwgeom/lwgeom_api.c
liblwgeom/ptarray.c

index 87b38a90c0e5cf35cbc878a6350f0dabf9501e23..99f485944e62714b0ed5a12e3049aaf01f0fb380 100644 (file)
@@ -312,7 +312,7 @@ void ptarray_affine(POINTARRAY *pa, const AFFINE *affine);
 /*
 * PointArray
 */
-char ptarray_isccw(const POINTARRAY *pa);
+int ptarray_isccw(const POINTARRAY *pa);
 int ptarray_has_z(const POINTARRAY *pa);
 int ptarray_has_m(const POINTARRAY *pa);
 double ptarray_signed_area(const POINTARRAY *pa);
index c3cff2001b00fb1e9e7256fcad4d83038d0e3b70..5301204a0a01a780e29a8af450868c0d622cea2f 100644 (file)
@@ -419,9 +419,9 @@ getPoint3dm_p(const POINTARRAY *pa, int n, POINT3DM *op)
 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;
 }
 
 /*
@@ -574,30 +574,6 @@ void printPA(POINTARRAY *pa)
 }
 
 
-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!
index d129d03a344dc0b61e07e66a7a071828cb5b97d3..75abf066bd8c4c0fd21d4f0e0b21d571e27f2ff3 100644 (file)
@@ -957,6 +957,15 @@ ptarray_signed_area(const POINTARRAY *pa)
        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)
 {
@@ -1503,16 +1512,21 @@ ptarray_length_2d(const POINTARRAY *pts)
 {
        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;
 }
@@ -1534,13 +1548,14 @@ ptarray_length(const POINTARRAY *pts)
        /* 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;
 }