PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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 2305 of file measures.c.

2306{
2307 POINT2D c;
2308 double r;
2309 /*if start==end, then use pt distance */
2310 if ((A->x == B->x) && (A->y == B->y))
2311 return lw_dist2d_pt_pt(p, A, dl);
2312
2313 /*
2314 * otherwise, we use comp.graphics.algorithms
2315 * Frequently Asked Questions method
2316 *
2317 * (1) AC dot AB
2318 * r = ---------
2319 * ||AB||^2
2320 * r has the following meaning:
2321 * r=0 P = A
2322 * r=1 P = B
2323 * r<0 P is on the backward extension of AB
2324 * r>1 P is on the forward extension of AB
2325 * 0<r<1 P is interior to AB
2326 */
2327
2328 r = ((p->x - A->x) * (B->x - A->x) + (p->y - A->y) * (B->y - A->y)) /
2329 ((B->x - A->x) * (B->x - A->x) + (B->y - A->y) * (B->y - A->y));
2330
2331 /*This is for finding the maxdistance.
2332 the maxdistance have to be between two vertexes, compared to mindistance which can be between two vertexes.*/
2333 if (dl->mode == DIST_MAX)
2334 {
2335 if (r >= 0.5)
2336 return lw_dist2d_pt_pt(p, A, dl);
2337 else /* (r < 0.5) */
2338 return lw_dist2d_pt_pt(p, B, dl);
2339 }
2340
2341 if (r < 0) /*If p projected on the line is outside point A*/
2342 return lw_dist2d_pt_pt(p, A, dl);
2343 if (r >= 1) /*If p projected on the line is outside point B or on point B*/
2344 return lw_dist2d_pt_pt(p, B, dl);
2345
2346 /*If the point p is on the segment this is a more robust way to find out that*/
2347 if ((((A->y - p->y) * (B->x - A->x) == (A->x - p->x) * (B->y - A->y))) && (dl->mode == DIST_MIN))
2348 {
2349 dl->distance = 0.0;
2350 dl->p1 = *p;
2351 dl->p2 = *p;
2352 }
2353
2354 /*If the projection of point p on the segment is between A and B
2355 then we find that "point on segment" and send it to lw_dist2d_pt_pt*/
2356 c.x = A->x + r * (B->x - A->x);
2357 c.y = A->y + r * (B->y - A->y);
2358
2359 return lw_dist2d_pt_pt(p, &c, dl);
2360}
char * r
Definition cu_in_wkt.c:24
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:2365
#define DIST_MIN
Definition measures.h:44
#define DIST_MAX
Definition measures.h:43
POINT2D p1
Definition measures.h:52
POINT2D p2
Definition measures.h:53
int mode
Definition measures.h:54
double distance
Definition measures.h:51
double y
Definition liblwgeom.h:376
double x
Definition liblwgeom.h:376

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

Here is the call graph for this function:
Here is the caller graph for this function: