Я сделал здесь (Ваша первая ссылка является его дубликатом)
Здесь вы найдете не только сечение, но и пример тессеракта 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
, если знак отрицательный, нормаль указывает внутрь. Поэтому, если вы знаете, каким образом вы хотите указать обратный порядок точек треугольника, если присутствует неправильное направление.