PostGIS  3.0.6dev-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 2305 of file measures.c.

2306 {
2307  POINT2D c;
2308  double r;
2309  /*if start==end, then use pt distance */
2310  if ((A->x == B->x) && (A->y == B->y))
2311  return lw_dist2d_pt_pt(p, A, dl);
2312 
2313  /*
2314  * otherwise, we use comp.graphics.algorithms
2315  * Frequently Asked Questions method
2316  *
2317  * (1) AC dot AB
2318  * r = ---------
2319  * ||AB||^2
2320  * r has the following meaning:
2321  * r=0 P = A
2322  * r=1 P = B
2323  * r<0 P is on the backward extension of AB
2324  * r>1 P is on the forward extension of AB
2325  * 0<r<1 P is interior to AB
2326  */
2327 
2328  r = ((p->x - A->x) * (B->x - A->x) + (p->y - A->y) * (B->y - A->y)) /
2329  ((B->x - A->x) * (B->x - A->x) + (B->y - A->y) * (B->y - A->y));
2330 
2331  /*This is for finding the maxdistance.
2332  the maxdistance have to be between two vertexes, compared to mindistance which can be between two vertexes.*/
2333  if (dl->mode == DIST_MAX)
2334  {
2335  if (r >= 0.5)
2336  return lw_dist2d_pt_pt(p, A, dl);
2337  else /* (r < 0.5) */
2338  return lw_dist2d_pt_pt(p, B, dl);
2339  }
2340 
2341  if (r < 0) /*If p projected on the line is outside point A*/
2342  return lw_dist2d_pt_pt(p, A, dl);
2343  if (r >= 1) /*If p projected on the line is outside point B or on point B*/
2344  return lw_dist2d_pt_pt(p, B, dl);
2345 
2346  /*If the point p is on the segment this is a more robust way to find out that*/
2347  if ((((A->y - p->y) * (B->x - A->x) == (A->x - p->x) * (B->y - A->y))) && (dl->mode == DIST_MIN))
2348  {
2349  dl->distance = 0.0;
2350  dl->p1 = *p;
2351  dl->p2 = *p;
2352  }
2353 
2354  /*If the projection of point p on the segment is between A and B
2355  then we find that "point on segment" and send it to lw_dist2d_pt_pt*/
2356  c.x = A->x + r * (B->x - A->x);
2357  c.y = A->y + r * (B->y - A->y);
2358 
2359  return lw_dist2d_pt_pt(p, &c, dl);
2360 }
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:2365
#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:376
double x
Definition: liblwgeom.h:376

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: