PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ distance2d_pt_seg()

double distance2d_pt_seg ( const POINT2D p,
const POINT2D A,
const POINT2D B 
)

The old function nessecary for ptarray_segmentize2d in ptarray.c.

Definition at line 2327 of file measures.c.

References distance2d_pt_pt(), FP_ABS, r, s, POINT2D::x, and POINT2D::y.

Referenced by lwline_split_by_point_to(), and ptarray_locate_point().

2328 {
2329  double r,s;
2330 
2331  /*if start==end, then use pt distance */
2332  if ( ( A->x == B->x) && (A->y == B->y) )
2333  return distance2d_pt_pt(p,A);
2334 
2335  /*
2336  * otherwise, we use comp.graphics.algorithms
2337  * Frequently Asked Questions method
2338  *
2339  * (1) AC dot AB
2340  * r = ---------
2341  * ||AB||^2
2342  * r has the following meaning:
2343  * r=0 P = A
2344  * r=1 P = B
2345  * r<0 P is on the backward extension of AB
2346  * r>1 P is on the forward extension of AB
2347  * 0<r<1 P is interior to AB
2348  */
2349 
2350  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) );
2351 
2352  if (r<0) return distance2d_pt_pt(p,A);
2353  if (r>1) return distance2d_pt_pt(p,B);
2354 
2355 
2356  /*
2357  * (2)
2358  * (Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
2359  * s = -----------------------------
2360  * L^2
2361  *
2362  * Then the distance from C to P = |s|*L.
2363  *
2364  */
2365 
2366  s = ( (A->y-p->y)*(B->x-A->x)- (A->x-p->x)*(B->y-A->y) ) /
2367  ( (B->x-A->x)*(B->x-A->x) +(B->y-A->y)*(B->y-A->y) );
2368 
2369  return FP_ABS(s) * sqrt(
2370  (B->x-A->x)*(B->x-A->x) + (B->y-A->y)*(B->y-A->y)
2371  );
2372 }
char * r
Definition: cu_in_wkt.c:24
double x
Definition: liblwgeom.h:312
double y
Definition: liblwgeom.h:312
char * s
Definition: cu_in_wkt.c:23
double distance2d_pt_pt(const POINT2D *p1, const POINT2D *p2)
The old function nessecary for ptarray_segmentize2d in ptarray.c.
Definition: measures.c:2302
#define FP_ABS(a)
Here is the call graph for this function:
Here is the caller graph for this function: