PostGIS  2.5.0dev-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 2204 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().

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