Войти
FAQ

Как определить, пересекаются ли отрезок со сферой?

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