PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ point_in_cone()

static int point_in_cone ( const POINT3D A1,
const POINT3D A2,
const POINT3D P 
)
static

Utility function for checking if P is within the cone defined by A1/A2.

Definition at line 3307 of file lwgeodetic.c.

3308{
3309 POINT3D AC; /* Center point of A1/A2 */
3310 double min_similarity, similarity;
3311
3312 /* Boundary case */
3313 if (point3d_equals(A1, P) || point3d_equals(A2, P))
3314 return LW_TRUE;
3315
3316 /* The normalized sum bisects the angle between start and end. */
3317 vector_sum(A1, A2, &AC);
3318 normalize(&AC);
3319
3320 /* The projection of start onto the center defines the minimum similarity */
3321 min_similarity = dot_product(A1, &AC);
3322
3323 /* If the edge is sufficiently curved, use the dot product test */
3324 if (fabs(1.0 - min_similarity) > 1e-10)
3325 {
3326 /* The projection of candidate p onto the center */
3327 similarity = dot_product(P, &AC);
3328
3329 /* If the projection of the candidate is larger than */
3330 /* the projection of the start point, the candidate */
3331 /* must be closer to the center than the start, so */
3332 /* therefore inside the cone */
3333 if (similarity > min_similarity)
3334 {
3335 return LW_TRUE;
3336 }
3337 else
3338 {
3339 return LW_FALSE;
3340 }
3341 }
3342 else
3343 {
3344 /* Where the edge is very narrow, the dot product test */
3345 /* fails, but we can use the almost-planar nature of the */
3346 /* problem space then to test if the vector from the */
3347 /* candidate to the start point in a different direction */
3348 /* to the vector from candidate to end point */
3349 /* If so, then candidate is between start and end */
3350 POINT3D PA1, PA2;
3351 vector_difference(P, A1, &PA1);
3352 vector_difference(P, A2, &PA2);
3353 normalize(&PA1);
3354 normalize(&PA2);
3355 if (dot_product(&PA1, &PA2) < 0.0)
3356 {
3357 return LW_TRUE;
3358 }
3359 else
3360 {
3361 return LW_FALSE;
3362 }
3363 }
3364 return LW_FALSE;
3365}
#define LW_FALSE
Definition liblwgeom.h:94
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
void normalize(POINT3D *p)
Normalize to a unit vector.
Definition lwgeodetic.c:615
static void vector_difference(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the difference of two vectors.
Definition lwgeodetic.c:476
static double dot_product(const POINT3D *p1, const POINT3D *p2)
Convert cartesian coordinates on unit sphere to lon/lat coordinates static void cart2ll(const POINT3D...
Definition lwgeodetic.c:446
void vector_sum(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the sum of two vectors.
Definition lwgeodetic.c:465
static int point3d_equals(const POINT3D *p1, const POINT3D *p2)
Utility function for ptarray_contains_point_sphere()
Definition lwgeodetic.c:42

References dot_product(), LW_FALSE, LW_TRUE, normalize(), point3d_equals(), vector_difference(), and vector_sum().

Referenced by edge_intersects().

Here is the call graph for this function:
Here is the caller graph for this function: