bool LineSegmentIntersector::intersects(const osg::BoundingSphere& bs) { // if bs not valid then return true based on the assumption that an invalid sphere is yet to be defined. if (!bs.valid()) return true; osg::Vec3d sm = _start - bs._center; double c = sm.length2()-bs._radius*bs._radius; if (c<0.0) return true; osg::Vec3d se = _end-_start; double a = se.length2(); double b = (sm*se)*2.0; double d = b*b-4.0*a*c; if (d<0.0) return false; d = sqrt(d); double div = 1.0/(2.0*a); double r1 = (-b-d)*div; double r2 = (-b+d)*div; if (r1<=0.0 && r2<=0.0) return false; if (r1>=1.0 && r2>=1.0) return false; // passed all the rejection tests so line must intersect bounding sphere, return true. return true; }
bool PrimitiveIntersector::intersects(const osg::BoundingSphere& bs) { // if bs not valid then return true based on the assumption that an invalid sphere is yet to be defined. if (!bs.valid()) return true; osg::Vec3d sm = _start - bs._center; double c = sm.length2()-bs._radius*bs._radius; if (c<0.0) return true; osg::Vec3d se = _end-_start; double a = se.length2(); double b = (sm*se)*2.0; double d = b*b-4.0*a*c; if (d<0.0) return false; d = sqrt(d); double div = 1.0/(2.0*a); double r1 = (-b-d)*div; double r2 = (-b+d)*div; if (r1<=0.0 && r2<=0.0) return false; if (r1>=1.0 && r2>=1.0) return false; if (_intersectionLimit == LIMIT_NEAREST && !getIntersections().empty()) { double ratio = (sm.length() - bs._radius) / sqrt(a); if (ratio >= getIntersections().begin()->ratio) return false; } // passed all the rejection tests so line must intersect bounding sphere, return true. return true; }