Алгоритм нахождения минимального расстояния между двумя треугольниками - PullRequest
0 голосов
/ 04 декабря 2018

Это лучше задать в Math.SE, но я сначала попробую здесь:

Если у меня есть два произвольных треугольника в трехмерном пространстве, как я могу определить минимальное расстояние между ними?См. Следующее: enter image description here Сложно увидеть на изображении, но треугольник BAC полностью находится в положительной Z-плоскости, тогда как треугольник DFE полностью находится в отрицательной Z-плоскости.Нормы для обоих треугольников параллельны плоскости XY.Минимальное расстояние между ними - это, вероятно, расстояние между двумя точками, которые я нанес (H и G).

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

Мне на самом деле не нужно само минимальное расстояние - в конечном счете, все, что мне нужно найти, - это треугольники или нетнаходятся в некотором эпсилоне друг от друга.

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

1 Ответ

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

Как упомянуто в комментарии Акселя, реализацию можно найти в PQP - Proximity Query Pack (в частности, файл TriDist.cpp).Тем не менее, нет никаких сопроводительных ссылок на алгоритм, и я не могу найти ничего об Эрике Ларсене, который, по-видимому, написал его (на самом деле, в этой статье 2014 года также упоминалось, что они не смогли найти какую-либо публикацию для алгоритмакроме исходного кода PQP).


Суть алгоритма довольно проста:

Сначала найдите минимальное расстояние между каждой парой ребер (всего 9 комбинаций).Здесь PQP использует следующий алгоритм:

Владимир Дж. Лумельский, О быстром вычислении расстояния между отрезками линии .Письма обработки информации, нет.21, стр. 55-61, 1985.

Представьте себе следующий сценарий (для простоты показан в 2-D): enter image description here

ABC треугольника наслева и треугольник DEF справа.Давайте представим, что мы смотрели на ребра AB и EF - мы обнаружили бы, что вершины B и F определяют самые близкие точки между двумя отрезками линии.Затем мы рисуем две плоскости в ближайших точках, которые перпендикулярны соединительному вектору (см. Ниже): enter image description here

Обратите внимание, что я закрасил вершины двух ребер, которые мы 'сравнивая синий, тогда как внешние края теперь зеленые.Теперь мы посмотрим на внешние ребра и проверим, находятся ли они в плите между двумя плоскостями.Поскольку вершина D находится между двумя плоскостями, мы знаем, что мы не нашли истинное минимальное расстояние между двумя треугольниками.

Теперь, если мы посмотрим на ребра BC и DE, мы увидим следующее расположение: enter image description here

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


В 2-D гарантируется, что минимальное расстояние вдоль краев обоих треугольников, но в 3-D это не так.Если вышеупомянутые проверки не нашли минимальное расстояние (т. Е. Ни одна пара ребер не прошла тест на плоскость), один из следующих случаев должен быть верным:

  1. Одна из ближайших точек - вершинаодного треугольника и другой ближайшей точки находится на поверхности другого треугольника
  2. Треугольники пересекаются
  3. Край одного треугольника параллелен грани другого треугольника
  4. Один или оба треугольника вырождены

Сначала вы должны проверить случай 1:

Проецируйте точки из первого треугольника во второй и возьмите произведение точек проецируемых точек с помощьюпервый треугольник нормальный.Все продукты с точками должны иметь одинаковый знак (если нет, поменяйте местами треугольники, с которыми вы работаете).Затем найдите вершину с самой короткой проекцией и убедитесь, что ее проекция действительно лежит на поверхности другого треугольника.Если это так, вы нашли свои две точки (вершину, на которую вы смотрите, а также ее проекцию на другой треугольник).

В противном случае он должен попадать в случаи 2 - 4.

Если в предыдущих проверках было показано, что два треугольника не пересекаются, то это либо случай 3, либо 4. В любом случае, просто используйтеминимальные баллы, найденные в первом тесте.В противном случае это должен быть случай 2. В этом случае минимальное расстояние равно нулю.

...