Рассчитать 3D сечение 4D формы (тессеракт)

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

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

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

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

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

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

Спасибо

1 ответ

Решение

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

Там вы найдете не только сечение, но и пример тессеракта 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 если знак отрицательный, нормаль указывает внутрь. Так что, если вы знаете, каким образом вы хотите указать обратный порядок точек треугольника, если присутствует неправильное направление.

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