Рассчитать 3D сечение 4D формы (тессеракт)
До сих пор я читал следующее о расчете точек пересечения 3D для четырехмерного объекта:
Как получить 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 ребра каждого треугольника тетраэдра. Каждый треугольник преобразуется после пересечения в:
ничего - игнорируй
одна точка - запомни это
один край - запомни его 2 балла
весь треугольник - запомни его 3 очка
Удалите повторяющиеся точки, и после этого у вас должен быть список точек (0,3
или же 4
точки) тетраэдра после пересечения так:
0
очки - игнорировать3
точки - рендеринг треугольника4
очки - рендер тетраэдра
есть также возможность 1
а также 2
точки, но вы можете игнорировать их, если вы не хотите визуализировать бесконечно тонкие линии и точки, в этом случае их визуализировать. Для получения дополнительной информации проверьте эту функцию по ссылке выше:
void mesh4D::draw_cut(double w_cut)
это именно так, как я описал здесь. Единственная проблема в том, что мы теряем обмотку многоугольника. Но это можно исправить, сделав точку между normal_of_triangle
и вектор center_of_triangle - center_of_tetrahedron
если знак отрицательный, нормаль указывает внутрь. Так что, если вы знаете, каким образом вы хотите указать обратный порядок точек треугольника, если присутствует неправильное направление.