Как определить, пересекаются ли отрезок со сферой?
Данный алгоритм может использоваться, например при рассчётах коллизий: сначала проверяем Bounding Sphere, а потом уже выходим на полигоны объекта.
Данный алгоритм может использоваться, например при рассчётах коллизий: сначала проверяем Bounding Sphere, а потом уже выходим на полигоны объекта.
VECTOR3D CrossProduct(const VECTOR3D& v1,const VECTOR3D& v2) { return VECTOR3D(v1.y*v2.z-v1.z*v2.y,-(v1.x*v2.z-v1.z*v2.x),v1.x*v2.y-v1.y*v2.x); } bool LineIntersectSphere(VECTOR3D p1,VECTOR3D p2,VECTOR3D center,float radius) { float S2=(float)fabs(CrossProduct(p1-center,p2-center).Distance2()); // находим квадрат площади * 4 треугольника (p1;p2;center) float c2= p2.Distance2(p1); // квадрат стороны (p1;p2) у треугольника (p1;p2;center) if(fabs(c2)<0.0001)return false; // если вдруг точки p1 и p2 очень близко... float h2=S2/c2; // квадрат расстояния.. из формулы 4S2=h2*c2 if(h2<radius*radius)return true; // если квадрат расстояния меньше квадрата радиуса, то.. return false; // иначе } [code]
12 апреля 2008