From 6c0c07160717a68b92ba427aadee9cbe91983fac Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 28 Sep 2004 09:00:33 +0000 Subject: [PATCH] Added ptarray_isccw(). Added extern modifiers to public prototypes. git-svn-id: http://svn.osgeo.org/postgis/trunk@902 b70326c6-7e19-0410-871a-916f4a2858ee --- lwgeom/lwgeom.h | 57 +++++++++++++++++++++++---------------------- lwgeom/lwgeom_api.c | 16 +++++++++++++ 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/lwgeom/lwgeom.h b/lwgeom/lwgeom.h index 5deff73e3..8fb74b01c 100644 --- a/lwgeom/lwgeom.h +++ b/lwgeom/lwgeom.h @@ -755,31 +755,32 @@ extern double nextUp_d(float d); // general utilities -double lwgeom_polygon_area(LWPOLY *poly); -double lwgeom_polygon_perimeter(LWPOLY *poly); -double lwgeom_polygon_perimeter2d(LWPOLY *poly); -double lwgeom_pointarray_length2d(POINTARRAY *pts); -double lwgeom_pointarray_length(POINTARRAY *pts); -void lwgeom_force2d_recursive(char *serialized, char *optr, int *retsize); -void lwgeom_force3d_recursive(char *serialized, char *optr, int *retsize); -void lwgeom_force4d_recursive(char *serialized, char *optr, int *retsize); -double distance2d_pt_pt(POINT2D *p1, POINT2D *p2); -double distance2d_pt_seg(POINT2D *p, POINT2D *A, POINT2D *B); -double distance2d_seg_seg(POINT2D *A, POINT2D *B, POINT2D *C, POINT2D *D); -double distance2d_pt_ptarray(POINT2D *p, POINTARRAY *pa); -double distance2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2); -int pt_in_ring_2d(POINT2D *p, POINTARRAY *ring); -int pt_in_poly_2d(POINT2D *p, LWPOLY *poly); -double distance2d_ptarray_poly(POINTARRAY *pa, LWPOLY *poly); -double distance2d_point_point(LWPOINT *point1, LWPOINT *point2); -double distance2d_point_line(LWPOINT *point, LWLINE *line); -double distance2d_line_line(LWLINE *line1, LWLINE *line2); -double distance2d_point_poly(LWPOINT *point, LWPOLY *poly); -double distance2d_poly_poly(LWPOLY *poly1, LWPOLY *poly2); -double distance2d_line_poly(LWLINE *line, LWPOLY *poly); -double lwgeom_mindistance2d_recursive(char *lw1, char *lw2); -void lwgeom_translate_recursive(char *serialized, double xoff, double yoff, double zoff); -void lwgeom_translate_ptarray(POINTARRAY *pa, double xoff, double yoff, double zoff); -int lwgeom_pt_inside_circle(POINT2D *p, double cx, double cy, double rad); -POINTARRAY *segmentize2d_ptarray(POINTARRAY *ipa, double dist); -int32 lwgeom_npoints(char *serialized); +extern double lwgeom_polygon_area(LWPOLY *poly); +extern double lwgeom_polygon_perimeter(LWPOLY *poly); +extern double lwgeom_polygon_perimeter2d(LWPOLY *poly); +extern double lwgeom_pointarray_length2d(POINTARRAY *pts); +extern double lwgeom_pointarray_length(POINTARRAY *pts); +extern void lwgeom_force2d_recursive(char *serialized, char *optr, int *retsize); +extern void lwgeom_force3d_recursive(char *serialized, char *optr, int *retsize); +extern void lwgeom_force4d_recursive(char *serialized, char *optr, int *retsize); +extern double distance2d_pt_pt(POINT2D *p1, POINT2D *p2); +extern double distance2d_pt_seg(POINT2D *p, POINT2D *A, POINT2D *B); +extern double distance2d_seg_seg(POINT2D *A, POINT2D *B, POINT2D *C, POINT2D *D); +extern double distance2d_pt_ptarray(POINT2D *p, POINTARRAY *pa); +extern double distance2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2); +extern int pt_in_ring_2d(POINT2D *p, POINTARRAY *ring); +extern int pt_in_poly_2d(POINT2D *p, LWPOLY *poly); +extern double distance2d_ptarray_poly(POINTARRAY *pa, LWPOLY *poly); +extern double distance2d_point_point(LWPOINT *point1, LWPOINT *point2); +extern double distance2d_point_line(LWPOINT *point, LWLINE *line); +extern double distance2d_line_line(LWLINE *line1, LWLINE *line2); +extern double distance2d_point_poly(LWPOINT *point, LWPOLY *poly); +extern double distance2d_poly_poly(LWPOLY *poly1, LWPOLY *poly2); +extern double distance2d_line_poly(LWLINE *line, LWPOLY *poly); +extern double lwgeom_mindistance2d_recursive(char *lw1, char *lw2); +extern void lwgeom_translate_recursive(char *serialized, double xoff, double yoff, double zoff); +extern void lwgeom_translate_ptarray(POINTARRAY *pa, double xoff, double yoff, double zoff); +extern int lwgeom_pt_inside_circle(POINT2D *p, double cx, double cy, double rad); +extern POINTARRAY *segmentize2d_ptarray(POINTARRAY *ipa, double dist); +extern int32 lwgeom_npoints(char *serialized); +extern bool ptarray_isccw(const POINTARRAY *pa); diff --git a/lwgeom/lwgeom_api.c b/lwgeom/lwgeom_api.c index 07c047710..a1dd2c1f3 100644 --- a/lwgeom/lwgeom_api.c +++ b/lwgeom/lwgeom_api.c @@ -3516,3 +3516,19 @@ lwexploded_findlength(LWGEOM_EXPLODED *exploded, int wantbbox) return size; } +bool +ptarray_isccw(const POINTARRAY *pa) +{ + int i; + double area = 0; + POINT2D *p1, *p2; + + for (i=0; inpoints-1; i++) + { + p1 = (POINT2D *)getPoint(pa, i); + p2 = (POINT2D *)getPoint(pa, i+1); + area += (p1->x * p2->y) - (p1->y * p2->x); + } + if ( area > 0 ) return 0; + else return 1; +} -- 2.40.0