PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ project_point_on_plane()

double project_point_on_plane ( POINT3DZ p,
PLANE3D pl,
POINT3DZ p0 
)

Finds a point on a plane from where the original point is perpendicular to the plane.

Definition at line 1531 of file measures3d.c.

1532 {
1533  /*In our plane definition we have a point on the plane and a normal vector (pl.pv), perpendicular to the plane
1534  this vector will be parallel to the line between our inputted point above the plane and the point we are
1535  searching for on the plane. So, we already have a direction from p to find p0, but we don't know the distance.
1536  */
1537 
1538  VECTOR3D v1;
1539  double f;
1540 
1541  if (!get_3dvector_from_points(&(pl->pop), p, &v1))
1542  return 0.0;
1543 
1544  f = DOT(pl->pv, v1);
1545  if (FP_IS_ZERO(f))
1546  {
1547  /* Point is in the plane */
1548  *p0 = *p;
1549  return 0;
1550  }
1551 
1552  f = -f / DOT(pl->pv, pl->pv);
1553 
1554  p0->x = p->x + pl->pv.x * f;
1555  p0->y = p->y + pl->pv.y * f;
1556  p0->z = p->z + pl->pv.z * f;
1557 
1558  return f;
1559 }
#define FP_IS_ZERO(A)
static int get_3dvector_from_points(POINT3DZ *p1, POINT3DZ *p2, VECTOR3D *v)
Definition: measures3d.c:34
#define DOT(u, v)
Definition: measures3d.h:31
POINT3DZ pop
Definition: measures3d.h:57
VECTOR3D pv
Definition: measures3d.h:58
double z
Definition: liblwgeom.h:411
double x
Definition: liblwgeom.h:411
double y
Definition: liblwgeom.h:411
double z
Definition: measures3d.h:52
double x
Definition: measures3d.h:52
double y
Definition: measures3d.h:52

References DOT, FP_IS_ZERO, get_3dvector_from_points(), PLANE3D::pop, PLANE3D::pv, POINT3DZ::x, VECTOR3D::x, POINT3DZ::y, VECTOR3D::y, POINT3DZ::z, and VECTOR3D::z.

Referenced by lw_dist3d_point_poly(), lw_dist3d_point_tri(), lw_dist3d_ptarray_poly(), and lw_dist3d_ptarray_tri().

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