From: Paul Ramsey Date: Thu, 25 Oct 2012 19:29:34 +0000 (+0000) Subject: Reorganize some pointarray loops and functions. Use direct aligned access more. X-Git-Tag: 2.1.0beta2~454 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c4baf67134c0f75a41ad628c5931c86ab107d48c;p=postgis Reorganize some pointarray loops and functions. Use direct aligned access more. git-svn-id: http://svn.osgeo.org/postgis/trunk@10564 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/liblwgeom_internal.h b/liblwgeom/liblwgeom_internal.h index 87b38a90c..99f485944 100644 --- a/liblwgeom/liblwgeom_internal.h +++ b/liblwgeom/liblwgeom_internal.h @@ -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); diff --git a/liblwgeom/lwgeom_api.c b/liblwgeom/lwgeom_api.c index c3cff2001..5301204a0 100644 --- a/liblwgeom/lwgeom_api.c +++ b/liblwgeom/lwgeom_api.c @@ -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; inpoints-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! diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index d129d03a3..75abf066b 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -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; inpoints-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; inpoints-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; }