PostGIS  2.5.0beta2dev-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 2205 of file measures.c.

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().

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