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);
}
+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)
{
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);
}
/**