PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ distance2d_sqr_pt_seg()

double distance2d_sqr_pt_seg ( const POINT2D C,
const POINT2D A,
const POINT2D B 
)

Definition at line 2408 of file measures.c.

2409 {
2410  /*if start==end, then use pt distance */
2411  if ((A->x == B->x) && (A->y == B->y))
2412  return distance2d_sqr_pt_pt(C, A);
2413 
2414  /*
2415  * otherwise, we use comp.graphics.algorithms
2416  * Frequently Asked Questions method
2417  *
2418  * (1) AC dot AB
2419  * r = ---------
2420  * ||AB||^2
2421  * r has the following meaning:
2422  * r=0 P = A
2423  * r=1 P = B
2424  * r<0 P is on the backward extension of AB
2425  * r>1 P is on the forward extension of AB
2426  * 0<r<1 P is interior to AB
2427  */
2428 
2429  double ba_x = (B->x - A->x);
2430  double ba_y = (B->y - A->y);
2431  double ab_length_sqr = (ba_x * ba_x + ba_y * ba_y);
2432  double ca_x = (C->x - A->x);
2433  double ca_y = (C->y - A->y);
2434  double dot_ac_ab = (ca_x * ba_x + ca_y * ba_y);
2435 
2436  if (dot_ac_ab <= 0)
2437  return distance2d_sqr_pt_pt(C, A);
2438  if (dot_ac_ab >= ab_length_sqr)
2439  return distance2d_sqr_pt_pt(C, B);
2440 
2441  /*
2442  * (2)
2443  * (Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
2444  * s = -----------------------------
2445  * L^2
2446  *
2447  * Then the distance from C to P = |s|*L.
2448  *
2449  */
2450 
2451  double s_numerator = ca_x * ba_y - ca_y * ba_x;
2452 
2453  /* Distance = (s_num / ab) * (s_num / ab) * ab == s_num * s_num / ab) */
2454  return s_numerator * s_numerator / ab_length_sqr;
2455 }
static double distance2d_sqr_pt_pt(const POINT2D *p1, const POINT2D *p2)
Definition: lwinline.h:35
double y
Definition: liblwgeom.h:390
double x
Definition: liblwgeom.h:390

References distance2d_sqr_pt_pt(), POINT2D::x, and POINT2D::y.

Referenced by lwline_split_by_point_to(), ptarray_closest_segment_2d(), and ptarray_locate_point().

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