PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ lw_dist3d_pt_seg()

int lw_dist3d_pt_seg ( POINT3DZ p,
POINT3DZ A,
POINT3DZ B,
DISTPTS3D dl 
)

If searching for min distance, this one finds the closest point on segment A-B from p.

if searching for max distance it just sends p-A and p-B to pt-pt calculation

Definition at line 723 of file measures3d.c.

References DIST_MAX, lw_dist3d_pt_pt(), DISTPTS3D::mode, r, POINT3DZ::x, POINT3DZ::y, and POINT3DZ::z.

Referenced by lw_dist3d_pt_ptarray(), and lw_dist3d_seg_seg().

724 {
725  POINT3DZ c;
726  double r;
727  /*if start==end, then use pt distance */
728  if ( ( A->x == B->x) && (A->y == B->y) && (A->z == B->z) )
729  {
730  return lw_dist3d_pt_pt(p,A,dl);
731  }
732 
733 
734  r = ( (p->x-A->x) * (B->x-A->x) + (p->y-A->y) * (B->y-A->y) + ( p->z-A->z) * (B->z-A->z) )/( (B->x-A->x)*(B->x-A->x) +(B->y-A->y)*(B->y-A->y)+(B->z-A->z)*(B->z-A->z) );
735 
736  /*This is for finding the 3Dmaxdistance.
737  the maxdistance have to be between two vertexes,
738  compared to mindistance which can be between
739  tvo vertexes vertex.*/
740  if (dl->mode == DIST_MAX)
741  {
742  if (r>=0.5)
743  {
744  return lw_dist3d_pt_pt(p,A,dl);
745  }
746  if (r<0.5)
747  {
748  return lw_dist3d_pt_pt(p,B,dl);
749  }
750  }
751 
752  if (r<0) /*If the first vertex A is closest to the point p*/
753  {
754  return lw_dist3d_pt_pt(p,A,dl);
755  }
756  if (r>1) /*If the second vertex B is closest to the point p*/
757  {
758  return lw_dist3d_pt_pt(p,B,dl);
759  }
760 
761  /*else if the point p is closer to some point between a and b
762  then we find that point and send it to lw_dist3d_pt_pt*/
763  c.x=A->x + r * (B->x-A->x);
764  c.y=A->y + r * (B->y-A->y);
765  c.z=A->z + r * (B->z-A->z);
766 
767  return lw_dist3d_pt_pt(p,&c,dl);
768 }
double z
Definition: liblwgeom.h:318
double y
Definition: liblwgeom.h:318
double x
Definition: liblwgeom.h:318
char * r
Definition: cu_in_wkt.c:24
int lw_dist3d_pt_pt(POINT3DZ *thep1, POINT3DZ *thep2, DISTPTS3D *dl)
Compares incomming points and stores the points closest to each other or most far away from each othe...
Definition: measures3d.c:788
int mode
Definition: measures3d.h:30
#define DIST_MAX
Definition: measures.h:16
Here is the call graph for this function:
Here is the caller graph for this function: