PostGIS  2.5.0dev-r@@SVN_REVISION@@
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 occation to lw_dist2d_pt_pt Before it was handling occations where r was between 0 and 1 internally and just returning the distance without identifying the points.

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

Definition at line 2200 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(), and lw_dist2d_selected_seg_seg().

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

Here is the call graph for this function:

Here is the caller graph for this function: