Перекрывающиеся кубики - PullRequest
       1

Перекрывающиеся кубики

6 голосов
/ 16 февраля 2011

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

Моя цель состоит в том, чтобы сгенерировать число случайно расположенных и не имеющих размераперекрывающиеся кубы.

Эти кубики изображены на декартовой плоскости ax, y, z.

Ответы [ 5 ]

8 голосов
/ 16 февраля 2011

Вы должны иметь возможность изменить Определить, перекрывают ли два прямоугольника друг друга? для вашей цели довольно легко.

Предположим, что у вас есть CubeA и CubeB.Любое из 6 условий гарантирует отсутствие перекрытия:

Cond1.  If A's left face is to the right of the B's right face,
           -  then A is Totally to right Of B
              CubeA.X2 < CubeB.X1
Cond2.  If A's right face is to the left of the B's left face,
           -  then A is Totally to left Of B
              CubeB.X2 < CubeA.X1
Cond3.  If A's top face is below B's bottom face,
           -  then A is Totally below B
              CubeA.Z2 < CubeB.Z1
Cond4.  If A's bottom face is above B's top face,
           -  then A is Totally above B
              CubeB.Z2 < CubeA.Z1
Cond5.  If A's front face is behind B's back face,
           -  then A is Totally behind B
              CubeB.Y2 < CubeA.Y1
Cond6.  If A's left face is to the left of B's right face,
           -  then A is Totally to the right of B
              CubeB.Y2 < CubeA.Y1

Таким образом, условие отсутствия перекрытия:

Cond1 or Cond2 or Cond3 or Cond4 or Cond5 or Cond6

Следовательно, достаточное условие перекрытия является противоположным (DeМорган)

Not Cond1 AND Not Cond2 And Not Cond3 And Not Cond4 And Not Cond5 And Not Cond6
3 голосов
/ 16 февраля 2011

Кубики состоят из 6 прямоугольных (ладно, квадратичных) граней.

Два куба не пересекаются, если выполняются следующие условия.

  • Ни одна из граней двух кубов не пересекается.
  • Один куб не содержит полностью другой.

Пост, который вы указали, может быть легко расширен.Просто добавьте Z.

2 голосов
/ 26 ноября 2018

Принятый ответ неверен и очень запутан. Вот что я придумала.

Определение перекрытия в плоскости x if (cubeA.maxX > cubeB.minX) if (cubeA.minX < cubeB.maxX)

Определение перекрытия в плоскости y if (cubeA.maxY > cubeB.minY) if (cubeA.minY < cubeB.minY)

Определение перекрытия в плоскости z if (cubeA.maxZ > cubeB.minZ) if (cubeA.minZ < cubeB.maxZ)

если вы И все эти условия вместе и результат ложный, вы знаете, что кубы пересекаются в какой-то момент.

Кредит: https://silentmatt.com/rectangle-intersection/

0 голосов
/ 11 декабря 2018

Это только принятый ответ, переписанный с исправлением.Он проверяет, имеют ли две выровненные по оси кубоиды какой-либо общий сегмент по осям X, Y и Z. Если они не совпадают, то для них невозможно столкновение.Функция предполагает наличие коллизии и выполняет тесты, чтобы проверить, нет ли.

Function func_Intersect(ByVal cuboid1_MinX As Double, ByVal cuboid1_MaxX As Double, ByVal cuboid1_MinY As Double, ByVal cuboid1_MaxY As Double, ByVal cuboid1_MinZ As Double, ByVal cuboid1_MaxZ As Double, ByVal cuboid2_MinX As Double, ByVal cuboid2_MaxX As Double, ByVal cuboid2_MinY As Double, ByVal cuboid2_MaxY As Double, ByVal cuboid2_MinZ As Double, ByVal cuboid2_MaxZ As Double) As Boolean
    func_Intersect = True
    If cuboid1_MaxX < cuboid2_MinX Then
        func_Intersect = False
    ElseIf cuboid2_MaxX < cuboid1_MinX Then
        func_Intersect = False
    ElseIf cuboid1_MaxY < cuboid2_MinY Then
        func_Intersect = False
    ElseIf cuboid2_MaxY < cuboid1_MinY Then
        func_Intersect = False
    ElseIf cuboid1_MaxZ < cuboid2_MinZ Then
        func_Intersect = False
    ElseIf cuboid2_MaxZ < cuboid1_MinZ Then
        func_Intersect = False
    End If
End Function
0 голосов
/ 17 февраля 2011

Полагаю (не особо задумывался, может быть, моего состояния недостаточно), проверьте, все ли вершины первого куба выходят за пределы второго и обратного: все вершины второго выходят из первого.

Чтобы проверить, находится ли вершина в кубе или нет, преобразуйте ее координаты в систему координат, связанную с кубом (примените перевод к центру куба и вращение куба). Затем просто проверьте, что каждая координата (x, y, z) меньше половины стороны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...