Как найти объем пересечения двух тетраэдров?

введите сюда описание изображения

Я нашел статью в которой описан алгоритм поиска пересечения двух тетраэдров

https://www.unige.ch/~mccoid/ongoing/Intersection_of_tetrahedra.pdf

Но не нашел реализации, поделитесь пожалуйста


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Один тетраэдр превращаем в набор полупространств. Из второго берём грани по одной. Для одной грани все полупространства пересекаем с плоскостью грани. Получится треугольник и четыре полуплоскости - это всё на плоскости. Треугольник отсекаем полуплоскостями: получится многоугольник или вырожденный многоугольник или пустое множество. По многоугольнику в плоскости восстанавливаем многоугольник в пространстве.

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

На каждом из восьми многоугольников строим пирамиду с вершиной в глобальном нуле. Для такой пирамиды есть формула объёма со знаком - получается из формулы объёма тетраэдра со знаком. Складываем все объёмы пирамид - сумма есть объём пересечения двух тетраэдров.

→ Ссылка
Автор решения: VladD

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

Исходный первый тетраэдр пересекаем с первым полупространством, пересечение разбиваем на тетраэдры, каждый из этих тетраэдров пересекаем со вторым полупространством, получившиеся фигуры снова разбиваем на тетраэдры, получаем новый набор тетраэдров, и к ним применяем ту же процедуру итеративно, пока не закончатся полупространства. Объём каждого из итоговых тетраэдров можно найти, например, как смешанное произведение векторов его сторон.

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

  1. Все вершины тетраэдра лежат вне нашего полупространства, тогда наше пересечение — пустое множество. Этот случай тривиален.

  2. Все вершины тетраэдра лежат в нашем полупространстве, тогда наше пересечение — весь тетраэдр. Этот случай также тривиален.

  3. 1 вершина тетраэдра лежит в нашем полупространстве. Мы имеем в пересечении тетраэдр DPQR, так что разбиение на тетраэдры тут тоже тривиально.

случай 1 вершины

  1. 3 вершины тетраэдра лежат в нашем полупространстве. Это тот же случай, но теперь нас интересует нижнее тело ABCQRP. Оно разбивается, например, на тетраэдры ABCP, ACPR и APQR.

  2. Остался случай, когда две вершины лежат в нашем полупростанстве, а две другие — нет.

случай 2 вершин

Мы получаем тело CDPQRS. Отделив от него тетраэдр CDRS, получаем четырёхугольную пирамиду DPQRS, которая делится на тетраэдры DPQS и DRQS.

(Вырожденные случаи, когда одна из вершин лежит на плоскости, можно отнести к тому или другому случаю.)

Таким образом, мы можем получить разбиение исходной фигуры на тетраэдры, и найти нужный объём.

→ Ссылка