PostGIS  2.2.8dev-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 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 2190 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().

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