Mercurial > hg > orthanc-stone
comparison Framework/Toolbox/GeometryToolbox.cpp @ 151:c5044bbfc303 wasm
CoordinateSystem3D::IntersectSegment()
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 01 Feb 2018 17:37:03 +0100 |
parents | 62670cc2bb50 |
children | 441cfe8e7440 |
comparison
equal
deleted
inserted
replaced
150:62670cc2bb50 | 151:c5044bbfc303 |
---|---|
443 r(2,0) = 0; | 443 r(2,0) = 0; |
444 r(2,1) = 0; | 444 r(2,1) = 0; |
445 r(2,2) = 1; | 445 r(2,2) = 1; |
446 return r; | 446 return r; |
447 } | 447 } |
448 | |
449 | |
450 bool IntersectPlaneAndSegment(Vector& p, | |
451 const Vector& normal, | |
452 double d, | |
453 const Vector& edgeFrom, | |
454 const Vector& edgeTo) | |
455 { | |
456 // http://geomalgorithms.com/a05-_intersect-1.html#Line-Plane-Intersection | |
457 | |
458 // Check for parallel line and plane | |
459 Vector direction = edgeTo - edgeFrom; | |
460 double denominator = boost::numeric::ublas::inner_prod(direction, normal); | |
461 | |
462 if (fabs(denominator) < 100.0 * std::numeric_limits<double>::epsilon()) | |
463 { | |
464 return false; | |
465 } | |
466 else | |
467 { | |
468 // Compute intersection | |
469 double t = -(normal[0] * edgeFrom[0] + | |
470 normal[1] * edgeFrom[1] + | |
471 normal[2] * edgeFrom[2] + d) / denominator; | |
472 | |
473 if (t >= 0 && t <= 1) | |
474 { | |
475 // The intersection lies inside edge segment | |
476 p = edgeFrom + t * direction; | |
477 return true; | |
478 } | |
479 else | |
480 { | |
481 return false; | |
482 } | |
483 } | |
484 } | |
448 } | 485 } |
449 } | 486 } |