Предположим, у одного из ваших шестигранников H1
есть вершины (x_1, y_1, z_1), (x_2, y_2, z_2), ...
. Найдите максимум и минимум в каждой координате: x_min = min(x_1, x_2, ...)
, x_max = max(x_1, x_2,...)
и т. Д. Сделайте то же самое для другого шестигранника H2
.
Если интервал [x_min(H1), x_max(H1)]
и интервал [x_min(H2), x_max(H2)]
не пересекаются (то есть либо x_max(H1) < x_min(H2)
, либо x_max(H2) < x_min(H1)
), тогда шестигранники не могут столкнуться. Повторите это для координат y
и z
. Качественно это все равно, что смотреть на тень каждого шестигранника на оси абсцисс. Если они не перекрываются, многогранники не могут сталкиваться.
Если какие-либо интервалы перекрываются, вам придется перейти к более точному обнаружению столкновений. Это будет намного сложнее. Очевидный метод грубой силы состоит в том, чтобы проверить, пересекает ли один из ребер один из граней другого, но я думаю, что вы можете сделать это намного лучше.
Способ грубой силы, чтобы проверить, пересекает ли ребро грань ... Сначала вы найдете пересечение линии, определяемой ребром, с плоскостью, заданной гранью (см. пример). Затем вы должны проверить, находится ли эта точка на самом деле на краю и на грани. Ребро легко - просто посмотрите, находятся ли координаты между координатами двух вершин, определяющих ребро. Лицо сложнее, особенно без каких-либо гарантий, что оно выпуклое. В общем случае вам нужно будет просто посмотреть, на какой стороне полуплоскости определены каждое ребро, на котором он находится. Если он находится на внутренней полуплоскости для всех из них, это внутри лица. У меня, к сожалению, сейчас нет времени, чтобы напечатать все это, но держу пари, что поиск в Google может помочь вам в этом. Но, конечно, это все грубая сила, и может быть, есть лучший путь. (И dmckee указывает на особый случай, который не обрабатывается)