PostGIS 3.0.6dev-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 3459 of file lwgeodetic.c.

3460{
3461 POINT3D AC; /* Center point of A1/A2 */
3462 double min_similarity, similarity;
3463
3464 /* Boundary case */
3465 if (point3d_equals(A1, P) || point3d_equals(A2, P))
3466 return LW_TRUE;
3467
3468 /* The normalized sum bisects the angle between start and end. */
3469 vector_sum(A1, A2, &AC);
3470 normalize(&AC);
3471
3472 /* The projection of start onto the center defines the minimum similarity */
3473 min_similarity = dot_product(A1, &AC);
3474
3475 /* If the edge is sufficiently curved, use the dot product test */
3476 if (fabs(1.0 - min_similarity) > 1e-10)
3477 {
3478 /* The projection of candidate p onto the center */
3479 similarity = dot_product(P, &AC);
3480
3481 /* If the projection of the candidate is larger than */
3482 /* the projection of the start point, the candidate */
3483 /* must be closer to the center than the start, so */
3484 /* therefor inside the cone */
3485 if (similarity > min_similarity)
3486 {
3487 return LW_TRUE;
3488 }
3489 else
3490 {
3491 return LW_FALSE;
3492 }
3493 }
3494 else
3495 {
3496 /* Where the edge is very narrow, the dot product test */
3497 /* fails, but we can use the almost-planar nature of the */
3498 /* problem space then to test if the vector from the */
3499 /* candidate to the start point in a different direction */
3500 /* to the vector from candidate to end point */
3501 /* If so, then candidate is between start and end */
3502 POINT3D PA1, PA2;
3503 vector_difference(P, A1, &PA1);
3504 vector_difference(P, A2, &PA2);
3505 normalize(&PA1);
3506 normalize(&PA2);
3507 if (dot_product(&PA1, &PA2) < 0.0)
3508 {
3509 return LW_TRUE;
3510 }
3511 else
3512 {
3513 return LW_FALSE;
3514 }
3515 }
3516 return LW_FALSE;
3517}
#define LW_FALSE
Definition liblwgeom.h:108
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
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: