Рассчитать 3D сечение 4D формы (тессеракт) - PullRequest
0 голосов
/ 24 апреля 2018

До сих пор я читал следующее о расчете точек пересечения 3D для 4D-объекта:

Простая реализация 4D сечения

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

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

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

(В отличие от того, что было показано в первой найденной мной ссылке, я хочу иметь возможность делать это при любой координате w на 4-ой оси, поэтому способ вычисления, который сохраняет положение трехмерного пространства вдоль оси w в ум, наряду с положением и ориентацией самого тессеракта)

Спасибо

1 Ответ

0 голосов
/ 25 апреля 2018

Я сделал здесь (Ваша первая ссылка является его дубликатом)

Здесь вы найдете не только сечение, но и пример тессеракта C ++ 4D с рендерингом сечений (без слишком).

Теперь, что вы спрашиваете, как вычислить пересечение между ребром геометрии и 4-мерной гиперплоскостью, выровненной по оси w = constant? Это легко, так как ребро - это линия, действительно определенная двумя точками p0,p1, поэтому вы можете использовать для этого линейную интерполяцию:

p(t) = p0 + (p1-p0)*t

это даст вам любую точку на линии, тогда как t = <0,1> - скалярный линейный параметр, определяющий, где на линии p(t) находится.

p(0) = p0
p(1) = p1
p(0.5) = mid point between p0,p1

Теперь вы просто хотите решить t, так что w равно вашей константе, пусть назовем ее w_cut плоскостью резания.

p(t).w = w_cut
p0.w + (p1.w-p0.w)*t = w_cut
t = (w_cut-p0.w) / (p1.w-p0.w)

, если t находится внутри интервала <0,1>, ребро пересекает вашу плоскость. если (p1.w-p0.w)=0 весь край находится в плоскости.

Теперь, как упомянуто в связанном ответе, это не относится к топологии, поэтому вы получите точки и ребра, но не получите информацию о взаимосвязях о том, как строить из них трехмерную геометрию, и для этого необходим тщательный анализ. Намного лучше организовать вашу сетку в форме тетраэдров и проверять пересечение ее треугольников, а не только ребер.

Итак, вы осматриваете 3 ребра каждого треугольника тетраэдра. Каждый треугольник после пересечения преобразуется в:

  1. ничего - игнорировать

  2. одна точка - запомните

  3. одно ребро - запомните его 2 балла

  4. весь треугольник - запомните его 3 балла

Удалите повторяющиеся точки, и после этого у вас должен быть список точек (0,3 или 4 точек) тетраэдра после пересечения, так:

  1. 0 баллов - игнорировать

  2. 3 точек - треугольник рендеринга

  3. 4 баллов - рендер тетраэдра

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

void mesh4D::draw_cut(double w_cut)

это именно так, как я описал здесь. Единственная проблема в том, что мы теряем обмотку многоугольника. Но это можно исправить, выполнив точку между normal_of_triangle и вектором center_of_triangle - center_of_tetrahedron, если знак отрицательный, нормаль указывает внутрь. Поэтому, если вы знаете, каким образом вы хотите указать обратный порядок точек треугольника, если присутствует неправильное направление.

...