PostGIS  2.3.6-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 2203 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().

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

Here is the call graph for this function:

Here is the caller graph for this function: