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

◆ unit_normal()

void unit_normal ( const POINT3D P1,
const POINT3D P2,
POINT3D normal 
)

Calculates the unit normal to two vectors, trying to avoid problems with over-narrow or over-wide cases.

Definition at line 541 of file lwgeodetic.c.

542{
543 double p_dot = dot_product(P1, P2);
544 POINT3D P3;
545
546 /* If edge is really large, calculate a narrower equivalent angle A1/A3. */
547 if ( p_dot < 0 )
548 {
549 vector_sum(P1, P2, &P3);
550 normalize(&P3);
551 }
552 /* If edge is narrow, calculate a wider equivalent angle A1/A3. */
553 else if ( p_dot > 0.95 )
554 {
555 vector_difference(P2, P1, &P3);
556 normalize(&P3);
557 }
558 /* Just keep the current angle in A1/A3. */
559 else
560 {
561 P3 = *P2;
562 }
563
564 /* Normals to the A-plane and B-plane */
565 cross_product(P1, &P3, normal);
566 normalize(normal);
567}
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 void cross_product(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the cross product of two vectors.
Definition lwgeodetic.c:454
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

References cross_product(), dot_product(), normalize(), vector_difference(), and vector_sum().

Referenced by clairaut_cartesian(), edge_calculate_gbox(), edge_intersection(), edge_intersects(), and vector_rotate().

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