Обнаружение столкновений многомерных ограничивающих рамок

Есть ответы для 2D / 3D обнаружения столкновений ограничивающей рамки, однако моя проблема в том, как развить ситуацию до многомерности (4D или больше)?

Вот код на 3D-корпус.

template<typename T, typename _Prd>
bool BoundingBox3<T,_Prd>::Collision( const BoundingBox3<T,_Prd>& cube ) const
{

Point3<T,_Prd> min_1 = center - Point3<T,_Prd>(length,depth,height)/2.0;
Point3<T,_Prd> max_1 = center + Point3<T,_Prd>(length,depth,height)/2.0;

Point3<T,_Prd> min_2 = cube.Center() - Point3<T,_Prd>(cube.Length(),cube.Depth(),cube.Height())/2.0;
Point3<T,_Prd> max_2 = cube.Center() + Point3<T,_Prd>(cube.Length(),cube.Depth(),cube.Height())/2.0;

if(Volume()<cube.Volume())
{
Vector3D::Swap(min_1,min_2);
Vector3D::Swap(max_1,max_2);
}

if(min_1[0]<=min_2[0] && min_1[1]<=min_2[1] && min_1[2]<=min_2[2]
&& max_1[0]>=min_2[0] && max_1[1]>=min_2[1] && max_1[2]>=min_2[2])
return true;

if(min_1[0]<=max_2[0] && min_1[1]<=max_2[1] && min_1[2]<=max_2[2]
&& max_1[0]>=max_2[0] && max_1[1]>=max_2[1] && max_1[2]>=max_2[2])
return true;

return false;
};

3

Решение

Одна коробка сталкивается с другой, если во всех измерениях существует пересекающийся диапазон.

Пересечение диапазона [a, b] с диапазоном [c, d] равно [max (a, c), min (b, d)].

В случае, если диапазоны не пересекаются, результатом будет недопустимый диапазон с началом диапазона, превышающим конец диапазона.

Таким образом, столкновение может быть сделано так:

bool collides(const Box &box1,const Box &box2)
{
assert(box1.numberOfDimensions()==box2.numberOfDimensions());
for (size_t i=0; i!=box1.numberOfDimensions(); ++i) {
float a = max(box1.minForDimension(i),box2.minForDimension(i));
float b = min(box1.maxForDimension(i),box2.maxForDimension(i));
if (a>b) return false;
}
return true;
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]