PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ closest_point_on_segment()

void closest_point_on_segment ( const POINT4D p,
const POINT4D A,
const POINT4D B,
POINT4D ret 
)

Definition at line 1280 of file ptarray.c.

1281 {
1282  double r;
1283 
1284  if ( FP_EQUALS(A->x, B->x) && FP_EQUALS(A->y, B->y) )
1285  {
1286  *ret = *A;
1287  return;
1288  }
1289 
1290  /*
1291  * We use comp.graphics.algorithms Frequently Asked Questions method
1292  *
1293  * (1) AC dot AB
1294  * r = ----------
1295  * ||AB||^2
1296  * r has the following meaning:
1297  * r=0 P = A
1298  * r=1 P = B
1299  * r<0 P is on the backward extension of AB
1300  * r>1 P is on the forward extension of AB
1301  * 0<r<1 P is interior to AB
1302  *
1303  */
1304  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) );
1305 
1306  if (r<=0)
1307  {
1308  *ret = *A;
1309  return;
1310  }
1311  if (r>=1)
1312  {
1313  *ret = *B;
1314  return;
1315  }
1316 
1317  ret->x = A->x + ( (B->x - A->x) * r );
1318  ret->y = A->y + ( (B->y - A->y) * r );
1319  ret->z = A->z + ( (B->z - A->z) * r );
1320  ret->m = A->m + ( (B->m - A->m) * r );
1321 }
char * r
Definition: cu_in_wkt.c:24
#define FP_EQUALS(A, B)
double m
Definition: liblwgeom.h:414
double x
Definition: liblwgeom.h:414
double z
Definition: liblwgeom.h:414
double y
Definition: liblwgeom.h:414

References FP_EQUALS, POINT4D::m, r, POINT4D::x, POINT4D::y, and POINT4D::z.

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

Here is the caller graph for this function: