From 2002bd670a0c39642826210b942eef244eb9817c Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Fri, 28 Sep 2012 20:30:26 +0000 Subject: [PATCH] Move some ptarray functions out of postgis and back into liblwgeom from silly old function that shouldn't even exist anymore (LWGEOM_inside_circle_point) git-svn-id: http://svn.osgeo.org/postgis/trunk@10338 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/liblwgeom.h.in | 2 +- liblwgeom/lwgeom.c | 20 ++++++++++++++++++++ postgis/lwgeom_functions_basic.c | 16 +++++++++------- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/liblwgeom/liblwgeom.h.in b/liblwgeom/liblwgeom.h.in index b1c7a01ac..767aade1a 100644 --- a/liblwgeom/liblwgeom.h.in +++ b/liblwgeom/liblwgeom.h.in @@ -1077,7 +1077,7 @@ extern double ptarray_length(const POINTARRAY *pts); extern int pt_in_ring_2d(const POINT2D *p, const POINTARRAY *ring); extern int pt_in_poly_2d(const POINT2D *p, const LWPOLY *poly); extern int azimuth_pt_pt(const POINT2D *p1, const POINT2D *p2, double *ret); -extern int lwgeom_pt_inside_circle(POINT2D *p, double cx, double cy, double rad); +extern int lwpoint_inside_circle(const LWPOINT *p, double cx, double cy, double rad); extern void lwgeom_reverse(LWGEOM *lwgeom); extern void lwline_reverse(LWLINE *line); extern void lwpoly_reverse(LWPOLY *poly); diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 60e055d05..e03cb5330 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -528,6 +528,26 @@ lwgeom_same(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2) } +int +lwpoint_inside_circle(const LWPOINT *p, double cx, double cy, double rad) +{ + POINT2D center; + POINT2D pt; + + if ( ! p || ! p->point ) + return LW_FALSE; + + getPoint2d_p(p->point, 0, &pt); + + center.x = cx; + center.y = cy; + + if ( distance2d_pt_pt(&pt, ¢er) < rad ) + return LW_TRUE; + + return LW_FALSE; +} + void lwgeom_drop_bbox(LWGEOM *lwgeom) { diff --git a/postgis/lwgeom_functions_basic.c b/postgis/lwgeom_functions_basic.c index c6106fd9f..df7f4f876 100644 --- a/postgis/lwgeom_functions_basic.c +++ b/postgis/lwgeom_functions_basic.c @@ -1027,22 +1027,24 @@ Datum LWGEOM_inside_circle_point(PG_FUNCTION_ARGS) double cx = PG_GETARG_FLOAT8(1); double cy = PG_GETARG_FLOAT8(2); double rr = PG_GETARG_FLOAT8(3); - LWPOINT *point; - POINT2D pt; + LWPOINT *lwpoint; + LWGEOM *lwgeom; + int inside; geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - point = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom)); - if ( point == NULL ) + lwgeom = lwgeom_from_gserialized(geom); + lwpoint = lwgeom_as_lwpoint(lwgeom); + if ( lwpoint == NULL || lwgeom_is_empty(lwgeom) ) { PG_FREE_IF_COPY(geom, 0); PG_RETURN_NULL(); /* not a point */ } - getPoint2d_p(point->point, 0, &pt); + inside = lwpoint_inside_circle(lwpoint, cx, cy, rr); + lwpoint_free(lwpoint); PG_FREE_IF_COPY(geom, 0); - - PG_RETURN_BOOL(lwgeom_pt_inside_circle(&pt, cx, cy, rr)); + PG_RETURN_BOOL(inside); } /** -- 2.40.0