Баунд Боксы — пересечение
Небольшая функция позволяет узнать наличие пересечений между двумя баунд боксами, каждый из которых определяется как точка Max и точка Min.
Сначала по каждой из осей проверяем возможно ли пересечение в принципе.
Потом, если по одной из осей есть пересечение — определяем другие пересечения.
public bool BoundingBoxIntersetion(PointXYZ minBound, PointXYZ maxBound, PointXYZ minVol, PointXYZ maxVol)
{
//NoIntersectionBy Max
if (maxBound.Y <= minVol.Y) return false;
if (maxBound.X <= minVol.X) return false;
if (maxBound.Z <= minVol.Z) return false;
//NoIntersectioBy Min
if (minBound.X >= maxVol.X) return false;
if (minBound.Y >= maxVol.Y) return false;
if (minBound.Z >= maxVol.Z) return false;
//IntersectionBy X
if ( (minBound.X < minVol.X && maxBound.X < maxVol.X) ||
(minBound.X >= minVol.X && maxBound.X > maxVol.X))
{
if (minBound.Y < maxVol.Y &&
maxBound.Y > minVol.Y &&
minBound.Z < maxVol.Z &&
maxBound.Z > minVol.Z) { return true; }
return false;
}
//IntersectionBy Y
if ( (minBound.Y < minVol.Y && maxBound.Y < maxVol.Y) ||
(minBound.Y >= minVol.Y && maxBound.Y > maxVol.Y) )
{
if ( minBound.X < maxVol.X &&
maxBound.X > minVol.X &&
minBound.Z < maxVol.Z &&
maxBound.Z > minVol.Z ) { return true; }
return false;
}
//IntersectionBy Z
if ( (minBound.Z < minVol.Z && maxBound.Z < maxVol.Z)||
(minBound.Z >=minVol.Z && maxBound.Z > maxVol.Z))
{
if ( minBound.X < maxVol.X &&
maxBound.X > minVol.X &&
minBound.Y < maxVol.Y &&
maxBound.Y > minVol.Y) { return true; }
return false;
}
return false;
}
Добавить комментарий