MCPcopy Create free account
hub / github.com/MapServer/MapServer / msDistanceSegmentToSegment

Function msDistanceSegmentToSegment

mapsearch.c:378–462  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

376/* Users of this code must verify correctness for their application. */
377
378double msDistanceSegmentToSegment(pointObj *pa, pointObj *pb, pointObj *pc, pointObj *pd)
379{
380 vectorObj dP;
381 vectorObj u, v, w;
382 double a, b, c, d, e;
383 double D;
384 double sc, sN, sD; /* N=numerator, D=demoninator */
385 double tc, tN, tD;
386
387 /* check for strictly parallel segments first */
388 /* if(((pa->x == pb->x) && (pc->x == pd->x)) || (slope(pa,pb) == slope(pc,pd))) { // vertical (infinite slope) || otherwise parallel */
389 /* D = msDistancePointToSegment(pa, pc, pd); */
390 /* D = MS_MIN(D, msDistancePointToSegment(pb, pc, pd)); */
391 /* D = MS_MIN(D, msDistancePointToSegment(pc, pa, pb)); */
392 /* return(MS_MIN(D, msDistancePointToSegment(pd, pa, pb))); */
393 /* } */
394
395 u.x = pb->x - pa->x; /* u = pb - pa */
396 u.y = pb->y - pa->y;
397 v.x = pd->x - pc->x; /* v = pd - pc */
398 v.y = pd->y - pc->y;
399 w.x = pa->x - pc->x; /* w = pa - pc */
400 w.y = pa->y - pc->y;
401
402 a = dot(u,u);
403 b = dot(u,v);
404 c = dot(v,v);
405 d = dot(u,w);
406 e = dot(v,w);
407
408 D = a*c - b*b;
409 sc = sN = sD = D;
410 tc = tN = tD = D;
411
412 /* compute the line parameters of the two closest points */
413 if(D < SMALL_NUMBER) { /* lines are parallel or almost parallel */
414 sN = 0.0;
415 sD = 1.0;
416 tN = e;
417 tD = c;
418 } else { /* get the closest points on the infinite lines */
419 sN = b*e - c*d;
420 tN = a*e - b*d;
421 if(sN < 0) {
422 sN = 0.0;
423 tN = e;
424 tD = c;
425 } else if(sN > sD) {
426 sN = sD;
427 tN = e + b;
428 tD = c;
429 }
430 }
431
432 if(tN < 0) {
433 tN = 0.0;
434 if(-d < 0)
435 sN = 0.0;

Callers 1

msDistanceShapeToShapeFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected