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

◆ closest_point_on_segment()

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

Definition at line 1263 of file ptarray.c.

1264{
1265 double r;
1266
1267 if ( FP_EQUALS(A->x, B->x) && FP_EQUALS(A->y, B->y) )
1268 {
1269 *ret = *A;
1270 return;
1271 }
1272
1273 /*
1274 * We use comp.graphics.algorithms Frequently Asked Questions method
1275 *
1276 * (1) AC dot AB
1277 * r = ----------
1278 * ||AB||^2
1279 * r has the following meaning:
1280 * r=0 P = A
1281 * r=1 P = B
1282 * r<0 P is on the backward extension of AB
1283 * r>1 P is on the forward extension of AB
1284 * 0<r<1 P is interior to AB
1285 *
1286 */
1287 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) );
1288
1289 if (r<0)
1290 {
1291 *ret = *A;
1292 return;
1293 }
1294 if (r>1)
1295 {
1296 *ret = *B;
1297 return;
1298 }
1299
1300 ret->x = A->x + ( (B->x - A->x) * r );
1301 ret->y = A->y + ( (B->y - A->y) * r );
1302 ret->z = A->z + ( (B->z - A->z) * r );
1303 ret->m = A->m + ( (B->m - A->m) * r );
1304}
char * r
Definition cu_in_wkt.c:24
#define FP_EQUALS(A, B)
double m
Definition liblwgeom.h:400
double x
Definition liblwgeom.h:400
double z
Definition liblwgeom.h:400
double y
Definition liblwgeom.h:400

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

Referenced by lwline_split_by_point_to(), and ptarray_locate_point().

Here is the caller graph for this function: