Как определить, пересекаются ли отрезок со сферой?
Данный алгоритм может использоваться, например при рассчётах коллизий: сначала проверяем 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