PostGIS  2.5.2dev-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 1231 of file measures3d.c.

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

Referenced by lw_dist3d_point_poly(), and lw_dist3d_ptarray_poly().

1232 {
1233 /*In our plane definition we have a point on the plane and a normal vector (pl.pv), perpendicular to the plane
1234 this vector will be parallel to the line between our inputted point above the plane and the point we are searching for on the plane.
1235 So, we already have a direction from p to find p0, but we don't know the distance.
1236 */
1237 
1238  VECTOR3D v1;
1239  double f;
1240 
1241  if (!get_3dvector_from_points(&(pl->pop), p, &v1))
1242  return 0.0;
1243 
1244  f = DOT(pl->pv, v1);
1245  if (FP_IS_ZERO(f))
1246  {
1247  /* Point is in the plane */
1248  *p0 = *p;
1249  return 0;
1250  }
1251 
1252  f = -f / DOT(pl->pv, pl->pv);
1253 
1254  p0->x = p->x + pl->pv.x * f;
1255  p0->y = p->y + pl->pv.y * f;
1256  p0->z = p->z + pl->pv.z * f;
1257 
1258  return f;
1259 }
double z
Definition: liblwgeom.h:336
double y
Definition: liblwgeom.h:336
double x
Definition: liblwgeom.h:336
double z
Definition: measures3d.h:51
VECTOR3D pv
Definition: measures3d.h:58
#define FP_IS_ZERO(A)
double y
Definition: measures3d.h:51
#define DOT(u, v)
Definition: measures3d.h:31
static int get_3dvector_from_points(POINT3DZ *p1, POINT3DZ *p2, VECTOR3D *v)
Definition: measures3d.c:45
POINT3DZ pop
Definition: measures3d.h:57
double x
Definition: measures3d.h:51
Here is the call graph for this function:
Here is the caller graph for this function: