| 376 | /* Users of this code must verify correctness for their application. */ |
| 377 | |
| 378 | double 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; |
no outgoing calls
no test coverage detected