PostGIS  2.5.7dev-r@@SVN_REVISION@@

◆ lw_dist2d_pt_seg()

int lw_dist2d_pt_seg ( const POINT2D p,
const POINT2D A,
const POINT2D B,
DISTPTS dl 
)

lw_dist2d_comp from p to line A->B This one is now sending every occasion to lw_dist2d_pt_pt Before it was handling occasions where r was between 0 and 1 internally and just returning the distance without identifying the points.

To get this points it was necessary to change and it also showed to be about 10faster.

Definition at line 2206 of file measures.c.

2207 {
2208  POINT2D c;
2209  double r;
2210  /*if start==end, then use pt distance */
2211  if ( ( A->x == B->x) && (A->y == B->y) )
2212  {
2213  return lw_dist2d_pt_pt(p,A,dl);
2214  }
2215  /*
2216  * otherwise, we use comp.graphics.algorithms
2217  * Frequently Asked Questions method
2218  *
2219  * (1) AC dot AB
2220  * r = ---------
2221  * ||AB||^2
2222  * r has the following meaning:
2223  * r=0 P = A
2224  * r=1 P = B
2225  * r<0 P is on the backward extension of AB
2226  * r>1 P is on the forward extension of AB
2227  * 0<r<1 P is interior to AB
2228  */
2229 
2230  r = ( (p->x-A->x) * (B->x-A->x) + (p->y-A->y) * (B->y-A->y) )/( (B->x-A->x)*(B->x-A->x) +(B->y-A->y)*(B->y-A->y) );
2231 
2232  /*This is for finding the maxdistance.
2233  the maxdistance have to be between two vertexes,
2234  compared to mindistance which can be between
2235  two vertexes vertex.*/
2236  if (dl->mode == DIST_MAX)
2237  {
2238  if (r>=0.5)
2239  {
2240  return lw_dist2d_pt_pt(p,A,dl);
2241  }
2242  if (r<0.5)
2243  {
2244  return lw_dist2d_pt_pt(p,B,dl);
2245  }
2246  }
2247 
2248  if (r<0) /*If p projected on the line is outside point A*/
2249  {
2250  return lw_dist2d_pt_pt(p,A,dl);
2251  }
2252  if (r>=1) /*If p projected on the line is outside point B or on point B*/
2253  {
2254  return lw_dist2d_pt_pt(p,B,dl);
2255  }
2256 
2257  /*If the point p is on the segment this is a more robust way to find out that*/
2258  if (( ((A->y-p->y)*(B->x-A->x)==(A->x-p->x)*(B->y-A->y) ) ) && (dl->mode == DIST_MIN))
2259  {
2260  dl->distance = 0.0;
2261  dl->p1 = *p;
2262  dl->p2 = *p;
2263  }
2264 
2265  /*If the projection of point p on the segment is between A and B
2266  then we find that "point on segment" and send it to lw_dist2d_pt_pt*/
2267  c.x=A->x + r * (B->x-A->x);
2268  c.y=A->y + r * (B->y-A->y);
2269 
2270  return lw_dist2d_pt_pt(p,&c,dl);
2271 }
char * r
Definition: cu_in_wkt.c:24
int lw_dist2d_pt_pt(const POINT2D *thep1, const POINT2D *thep2, DISTPTS *dl)
Compares incoming points and stores the points closest to each other or most far away from each other...
Definition: measures.c:2282
#define DIST_MIN
Definition: measures.h:44
#define DIST_MAX
Definition: measures.h:43
POINT2D p1
Definition: measures.h:52
POINT2D p2
Definition: measures.h:53
int mode
Definition: measures.h:54
double distance
Definition: measures.h:51
double y
Definition: liblwgeom.h:331
double x
Definition: liblwgeom.h:331

References DIST_MAX, DIST_MIN, DISTPTS::distance, lw_dist2d_pt_pt(), DISTPTS::mode, DISTPTS::p1, DISTPTS::p2, r, POINT2D::x, and POINT2D::y.

Referenced by lw_dist2d_pt_arc(), lw_dist2d_pt_ptarray(), lw_dist2d_seg_arc(), lw_dist2d_seg_seg(), lw_dist2d_selected_seg_seg(), rect_leaf_node_distance(), and rect_leaf_node_intersects().

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