Как вычислить пересечение выпуклого многогранника с другим многогранником?

Рассматриваемая проблема является частью научного моделирования, связанного с двумерным ростом в трехмерном пространстве. 2D-форма увеличивается путем добавления (треугольных) сегментов к ранее выращенной форме.

Объяснение изображения

Обратите внимание, что реальные сегменты в 3D имеют толщину, поэтому мой код фактически работает с треугольными призмами.

В какой-то момент эти 2D-формы (с любой относительной ориентацией и положением) сталкиваются.

Если одна из новых треугольных призм пересекается с ранее вставленными сегментами, я хочу вставить только «часть» сегмента, которая не пересекается с ранее вставленными сегментами. Как показано ниже для сегментов, обозначенных T1 и T2.

Схема стены

На первом этапе я рассчитал все пересечения ребер с гранями. Затем я использовал пакет CGAL Delaunay Triangulation в 3D для создания сетки результирующего набора точек в виде тетраэдрической сетки. В качестве последнего шага я отбрасываю все те тетраэдры, которые пересекаются с ранее вставленными отрезками. В большинстве случаев это прекрасно работает, но я уже убежден, что эта идея не может работать по фундаментальным причинам.

Какой более надежный способ вычислить это?


person Merlin    schedule 14.08.2015    source источник


Ответы (1)


Итак, вы хотите найти пересечение двух выпуклых оболочек?

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

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

Результатом будет пересечение - которое может быть ничем.

person James Gaunt    schedule 14.08.2015
comment
Я подумаю над вашим подходом. Однако две вещи: 1. Я не ищу пересечения, я фактически ищу дополнение нового отрезка к множеству всех (разумеется, только находящихся поблизости) ранее вставленных отрезков. Если у меня есть пересечение, мне все равно придется вычесть его из нового сегмента. - person Merlin; 15.08.2015