Разстояние между два изпъкнали многоъгълника в 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
Мисля, че забравяте да споменете случая, когато двата многоъгълника са успоредни. Включено е в 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

Това, което повечето хора са предложили в тази тема, е "вземете всички точки/ръбове на един многоъгълник и сравнете с всяка точка/ръбове на другия". Това вероятно ще работи добре, ако всичко, което правите, е да сравнявате два доста прости полигона и ако не сте твърде загрижени да правите това бързо.

Ако обаче искате доста лесен и по-добър метод. Използвайте, както е предложено от Ben Voigt, метод за квадратична оптимизация (т.е. Квадратно програмиране). По принцип вашите полигони са вашият набор от линейни ограничения, т.е. вашата точка на решение трябва да лежи към вътрешната страна на всеки ръб на вашия многоъгълник (това е ограничение от неравенство). И вашата разходна функция, която трябва да оптимизирате, е само евклидовото разстояние, т.е. Q в стандартната формулировка е само матрицата на идентичност. Веднъж хвърлен като такъв проблем, можете или да използвате библиотека, която решава този проблем (има много от тях там), или можете да го изучавате от книга и да навиете свой собствен код за него (това е доста лесен алгоритъм за кодиране ).

Ако искате реален метод за това, например, ако този прост тест от многоъгълник към многоъгълник е първата стъпка към по-сложни 3D форми (като твърдо тяло, направено от многоъгълници). Тогава най-вероятно просто трябва да използвате пакет, който вече прави това. Тук е набор от библиотеки за откриване на сблъсък, много от които извеждат дълбочина на проникване или, еквивалентно, минимално разстояние.

person Mikael Persson    schedule 25.02.2011
comment
Благодаря, това изглежда като интересна тема. Не отивам към по-сложни форми, просто търся прости двойки разстояния за 3D лица. - 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