PostGIS  2.4.9dev-r@@SVN_REVISION@@

## ◆ 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 537 of file lwgeodetic.c.

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

538 {
539  double p_dot = dot_product(P1, P2);
540  POINT3D P3;
541
542  /* If edge is really large, calculate a narrower equivalent angle A1/A3. */
543  if ( p_dot < 0 )
544  {
545  vector_sum(P1, P2, &P3);
546  normalize(&P3);
547  }
548  /* If edge is narrow, calculate a wider equivalent angle A1/A3. */
549  else if ( p_dot > 0.95 )
550  {
551  vector_difference(P2, P1, &P3);
552  normalize(&P3);
553  }
554  /* Just keep the current angle in A1/A3. */
555  else
556  {
557  P3 = *P2;
558  }
559
560  /* Normals to the A-plane and B-plane */
561  cross_product(P1, &P3, normal);
562  normalize(normal);
563 }
void normalize(POINT3D *p)
Normalize to a unit vector.
Definition: lwgeodetic.c:611
static double dot_product(const POINT3D *p1, const POINT3D *p2)
Convert cartesion coordinates on unit sphere to lon/lat coordinates static void cart2ll(const POINT3D...
Definition: lwgeodetic.c:442
static void vector_difference(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the difference of two vectors.
Definition: lwgeodetic.c:472
void vector_sum(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the sum of two vectors.
Definition: lwgeodetic.c:461
static void cross_product(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the cross product of two vectors.
Definition: lwgeodetic.c:450
Here is the call graph for this function: Here is the caller graph for this function: 