Как получить 3D сечение 4D сетки?

У меня есть многоугольник, представленный как четырехмерная сетка, сохраненная с помощью метода face-vertex. Все лица являются треугольниками. Как я могу получить трехмерное сечение фигуры?

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

1 ответ

Решение

Работать с четырьмя измерениями немного сложно.

Единственный способ решить проблему - найти размерные аналогии.

Начнем с 2D

Выпуклый 2D многоугольник имеет выпуклые 1D стороны: отрезки.

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

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

Для этого легко преобразовать координаты, чтобы вы сделали поперечное сечение по оси Y системы координат. Две точки ребра - это A и B. Их координаты: a1, a2 и b1, b2.

Если знаки a1 и b1 совпадают (aka a1*b1 > 0), ребро не пересекает ось Y.

В противном случае вычислите k = a1/(a1-b1).

Тогда координата точки пересечения будет: (0; (1-k)*a2+k*b2)

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

Теперь давайте обобщим в 3D

Выпуклая трехмерная сетка имеет выпуклые двумерные стороны: треугольники.

Опять же, измените координаты, чтобы упростить операцию. Давайте получим поперечное сечение сетки на плоскости YZ, чтобы координаты X снова были равны нулю.

Получите сечения треугольников. Используя приведенный выше алгоритм для каждого из них. Поскольку у нас есть 3 измерения, конечные точки ребра будут иметь координаты a1, a2, a3 и b1, b2, b3. Если a1*b1<0, у нас есть точка пересечения. Так

Пусть k = a1 / (a1 - b1)

Координата точки пересечения имеет вид (0; (1-k)*a2+k*b2; (1-k)*a3+k*b3). Сохраните эту координату, но также сохраните индекс точек A и B сетки (индекс края). Это будет полезно позже.

Для каждого треугольника это даст отрезок.

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

Теперь давайте обобщим на 4D

Выпуклая четырехмерная сетка имеет выпуклые трехмерные "грани": тетраэдры. (обратите внимание, что, возможно, ваше представление вершины лица неверно)

Опять же, измените координаты, чтобы упростить операцию. Давайте получим поперечное сечение сетки на гиперплоскости YZW, чтобы координаты X снова были равны нулю.

Получить сечения тетраэдров. Используя приведенный выше алгоритм для каждого из них. Поскольку у нас есть 4 измерения, конечные точки ребра будут иметь координаты a1, a2, a3, a4 и b1, b2, b3, b4. Если a1*b1<0, у нас есть точка пересечения. Так

Пусть k = a1 / (a1 - b1)

Координата точки пересечения равна (0; (1-k)*a2+k*b2; (1-k)*a3+k*b3; (1-k)*a4+k*b4).

Для каждого треугольника тетраэдра это даст отрезок. Для каждого тетраэдра это даст треугольник. Для каждого ребра этих треугольников также сохраните индекс точек A, B и C треугольника 3D-сетки (индекс лица), из которого происходит отрезок линии. Это будет полезно позже.

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

Для вогнутых четырехмерных сеток вы можете получить несколько трехмерных сеток.


Надеюсь, вы видите аналогию.

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

Другие вопросы по тегам