Как упомянуто в комментарии Акселя, реализацию можно найти в PQP - Proximity Query Pack (в частности, файл TriDist.cpp).Тем не менее, нет никаких сопроводительных ссылок на алгоритм, и я не могу найти ничего об Эрике Ларсене, который, по-видимому, написал его (на самом деле, в этой статье 2014 года также упоминалось, что они не смогли найти какую-либо публикацию для алгоритмакроме исходного кода PQP).
Суть алгоритма довольно проста:
Сначала найдите минимальное расстояние между каждой парой ребер (всего 9 комбинаций).Здесь PQP использует следующий алгоритм:
Владимир Дж. Лумельский, О быстром вычислении расстояния между отрезками линии .Письма обработки информации, нет.21, стр. 55-61, 1985.
Представьте себе следующий сценарий (для простоты показан в 2-D):
ABC треугольника наслева и треугольник DEF справа.Давайте представим, что мы смотрели на ребра AB и EF - мы обнаружили бы, что вершины B и F определяют самые близкие точки между двумя отрезками линии.Затем мы рисуем две плоскости в ближайших точках, которые перпендикулярны соединительному вектору (см. Ниже):
Обратите внимание, что я закрасил вершины двух ребер, которые мы 'сравнивая синий, тогда как внешние края теперь зеленые.Теперь мы посмотрим на внешние ребра и проверим, находятся ли они в плите между двумя плоскостями.Поскольку вершина D находится между двумя плоскостями, мы знаем, что мы не нашли истинное минимальное расстояние между двумя треугольниками.
Теперь, если мы посмотрим на ребра BC и DE, мы увидим следующее расположение:
Поскольку обе боковые вершины находятся за пределами двух плоскостей, мы можем гарантировать, что мы нашли минимальное расстояние между двумя треугольниками.
В 2-D гарантируется, что минимальное расстояние вдоль краев обоих треугольников, но в 3-D это не так.Если вышеупомянутые проверки не нашли минимальное расстояние (т. Е. Ни одна пара ребер не прошла тест на плоскость), один из следующих случаев должен быть верным:
- Одна из ближайших точек - вершинаодного треугольника и другой ближайшей точки находится на поверхности другого треугольника
- Треугольники пересекаются
- Край одного треугольника параллелен грани другого треугольника
- Один или оба треугольника вырождены
Сначала вы должны проверить случай 1:
Проецируйте точки из первого треугольника во второй и возьмите произведение точек проецируемых точек с помощьюпервый треугольник нормальный.Все продукты с точками должны иметь одинаковый знак (если нет, поменяйте местами треугольники, с которыми вы работаете).Затем найдите вершину с самой короткой проекцией и убедитесь, что ее проекция действительно лежит на поверхности другого треугольника.Если это так, вы нашли свои две точки (вершину, на которую вы смотрите, а также ее проекцию на другой треугольник).
В противном случае он должен попадать в случаи 2 - 4.
Если в предыдущих проверках было показано, что два треугольника не пересекаются, то это либо случай 3, либо 4. В любом случае, просто используйтеминимальные баллы, найденные в первом тесте.В противном случае это должен быть случай 2. В этом случае минимальное расстояние равно нулю.