Расстояние между двумя выпуклыми многоугольниками в 3D

У меня есть два выпуклых многоугольника в 3D. Они оба плоские на разных плоскостях, так что это пара лиц.

Как проще всего рассчитать ближайшее расстояние между этими двумя многоугольниками?

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


person Dmi    schedule 24.02.2011    source источник
comment
Вы ищете расстояние между их центроидами или расстояние между их двумя ближайшими краями?   -  person Joshua Rodgers    schedule 25.02.2011
comment
Значит, не расстояние между двумя ближайшими точками? Как вы определяете ближайший край и, учитывая подходящее определение, как вы определяете расстояние между двумя ближайшими краями?   -  person Troubadour    schedule 25.02.2011
comment
Длина самой короткой линии, конечная точка которой находится в первом многоугольнике, а другая конечная точка - во втором многоугольнике. Расстояние, которое я ищу, - это длина этой самой короткой линии.   -  person Dmi    schedule 25.02.2011
comment
Это не два ближайших края, это две самые близкие точки. В таком случае +1, отличный вопрос :)   -  person BlueRaja - Danny Pflughoeft    schedule 25.02.2011
comment
Обратите внимание, что если два многоугольника параллельны, то самая короткая линия не уникальна;) Но поскольку все эти самые короткие линии имеют одинаковую длину, расстояние по-прежнему четко определено.   -  person Alink    schedule 25.02.2011


Ответы (5)


Это простая ограниченная оптимизация с линейными ограничениями и квадратичной целевой функцией. Можно использовать множество алгоритмов, например градиентный спуск.

person Ben Voigt    schedule 25.02.2011
comment
Не могли бы вы объяснить немного подробнее - какой была бы квадратичная целевая функция? - person BlueRaja - Danny Pflughoeft; 25.02.2011
comment
Цель - минимизировать (x2 - x1) ** 2 + (y2 - y1) ** 2 + (z1 - z1) ** 2. Точки, которые дают минимальное расстояние, также дают минимальное расстояние в квадрате. - person Ben Voigt; 25.02.2011
comment
Ах, и ограничения были бы таковы, что x1, y1, z1 лежат на такой-то плоскости, а x1, y1, z1 лежат на этой половине плоскости для каждого ребра. Блестяще! Пока вы можете разделить плоскость пополам в 3D-пространстве, используя одно уравнение (которое, я считаю, вы можете, но, честно говоря, я не думал об этом), это будет работать , и будет проще и менее подвержен ошибкам, чем мой метод. +1! - person BlueRaja - Danny Pflughoeft; 25.02.2011
comment
@BlueRaja: линейное неравенство создает полупространство. Линейное равенство создает плоскость (которая может быть выражена как пересечение двух неравенств), а затем пересечение большего количества полупространств в конечном итоге позволяет получить любую выпуклую форму. - person Ben Voigt; 25.02.2011

Что ж, есть только несколько возможностей; Самая короткая линия между двумя полигонами может быть:

  1. Между двумя вершинами
  2. Между ребром и вершиной
  3. Между двумя краями (представьте себе два многоугольника на перпендикулярных плоскостях)
  4. Между вершиной и внутренней частью многоугольника
  5. Или полигоны пересекаются

Все случаи 1-3 обрабатываются путем обработки каждой пары ребро + вершина как линейного сегмента и перечисления расстояние между всеми парами сегментов линии.

Для случая 4 найдите расстояние между каждой вершиной и плоскостью другого многоугольника. Убедитесь, что линия (от вершины до ближайшей точки на плоскости) находится внутри другого многоугольника; в противном случае самая короткая линия до другого многоугольника будет по его периметру, о чем уже позаботились в случае 1 или 2.
(обязательно выполните эту проверку для обоих многоугольники)

Для случая 5 хотя бы один отрезок линии должен пересекаться с площадью другого многоугольника - если бы они пересекались по своим периметрам, мы бы поймали его уже в случаях 1-3, а если бы вершина пересекала область, мы бы поймали это в случае 4. Так что просто проверьте пересечение каждого края с плоскостью другого многоугольника и посмотрите, точка пересечения находится внутри другого многоугольника.
(обязательно сделайте эту проверку для обоих многоугольников)

Возьмите минимальное расстояние, найденное во всем этом, и мы закончили.

person BlueRaja - Danny Pflughoeft    schedule 25.02.2011
comment
Это кажется достаточно простым, я попробую. - person Dmi; 25.02.2011
comment
Думаю, вы забыли упомянуть случай, когда 2 полигона параллельны. Он включен в 1-4, поэтому нет проблем, но лучше имейте это в виду при выполнении математических расчетов для проекций и т. Д. Потому что поиск точки пересечения без учета параллельного случая часто вызывает неприятные ошибки. Например, при проверке на 5 нужно следить за этим (пересечение каждого ребра с плоскостью другого многоугольника). - person Alink; 25.02.2011
comment
@Alink: Правильно, я не упомянул об этом, потому что он включен в 1-4, но это повод для беспокойства. Случай edge / inside-of-other-polygon - еще один: он включен в случаи 3-4, но все же о чем нужно знать (по крайней мере, для тестирования). - person BlueRaja - Danny Pflughoeft; 25.02.2011
comment
@Dmi: Я вижу, вы правильно отметили. Я действительно думаю, что вам следует подумать о решении @Ben Voigt; это действительно правильный ответ. - person BlueRaja - Danny Pflughoeft; 25.02.2011
comment
Спасибо, я действительно реализовал это сейчас, и он хорошо работает. Я также рассмотрю другой метод после того, как немного прочту о квадратичном программировании. - person Dmi; 26.02.2011

Большинство людей предложили в этой цепочке «взять все точки / ребра одного многоугольника и сравнить с каждой точкой / ребрами другого». Это, вероятно, сработает нормально, если все, что вы сделаете, это сравните два довольно простых многоугольника, и если вы не слишком озабочены тем, чтобы сделать это быстро.

Однако, если вам нужен довольно простой и лучший способ. Используйте, как предлагает Бен Фойгт, метод квадратичной оптимизации (например, квадратичное программирование). По сути, ваши многоугольники - это ваш набор линейных ограничений, т.е. ваша точка решения должна лежать на внутренней стороне каждого края вашего многоугольника (это ограничение неравенства). И ваша функция затрат для оптимизации - это просто евклидово расстояние, то есть Q в стандартной формулировке - это просто единичная матрица. После того, как эта проблема была представлена ​​как такая проблема, вы можете либо использовать библиотеку, которая решает эту проблему (их много), либо вы можете изучить ее из книги и накатать свой собственный код для нее (это довольно простой алгоритм для кодирования ).

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

person Mikael Persson    schedule 25.02.2011
comment
Спасибо, похоже, интересная тема. Я не собираюсь переходить к более сложным формам, просто ищу простые пары расстояний для трехмерных лиц. - person Dmi; 25.02.2011

Непонятно, что вы пробовали.

Это похоже на сегменты как таковые.

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

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

person Keith    schedule 25.02.2011
comment
@BlueRaja, @Dmi. Хорошо, пропустил отмеченный случай. Мне все еще кажется, что должен работать относительно тупой алгоритм. Проблема в вычислении расстояний между парами примитивов (поверхность, ребро, вершина) или в определении того, какие наборы пар примитивов необходимо вычислить? Или быть уверенным, что даже проверка всех примитивных пар соответствует требованиям? - person Keith; 25.02.2011
comment
Это было бы хорошо, за исключением того, что один многоугольник может касаться другого многоугольника в его центре под прямым углом. В этом случае у второго многоугольника будет край или вершина, которая касается плоскости первого многоугольника, но все еще находится на расстоянии от краев первого многоугольника. - person Dmi; 25.02.2011

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

person Davido    schedule 25.02.2011
comment
Вершины могут не совпадать. Например, эти два многоугольника могут касаться друг друга под прямым углом, при этом одна из вершин второго многоугольника касается первого многоугольника в центре. - person Dmi; 25.02.2011