计算 4D 形状的 3D 横截面(tesseract)
Calculate 3D cross section of 4D shape (tesseract)
到目前为止,我已经阅读了以下有关计算 4D 对象的 3D 相交点的内容:
Simple implementation of 4D cross-section
How do I get a 3D cross section of a 4D mesh?
但是,我真的很困惑这是怎么回事。我知道我需要计算 4D 对象的每个边缘(在我的例子中是 tesseract)与 3D space 相交的点,然后加入计算出的点,但是我不确定如何计算相交将完成。
如果有人可以解释他们将如何计算完整的 3D 横截面,那就太好了,但是我会对如何计算 1 个 4D 边的交点(如两个 4D 点之间的交点)感到满意。
(与我发现的第一个 link 中显示的不同,我希望能够在第 4 轴上的任何 w 坐标处执行此操作,因此一种计算方式可以保持 3D 的位置space 沿着 w 轴,以及 tesseract 本身的位置和方向)
谢谢
我在这里做了(你的第一个 link 是它的副本)
你会发现不仅仅是横截面,还有带有横截面渲染的 C++ 4D tesseract 示例(没有太)。
现在您要问的是如何计算几何边缘与轴对齐的 4D 超平面之间的交点 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
整条边都在平面内。
现在正如 linked 回答中提到的,这不涉及拓扑,因此您将获得点和边,但不会获得关于如何从它们构建 3D 几何的互连信息,并且需要进行彻底的分析这样做。更好的做法是以四面体的形式组织网格并检查其三角形的交点而不是单独检查边。
所以你检查了四面体每个三角形的 3 条边。每个三角形在相交后将转换为:
无 - 忽略
单点-记住了
单边-记住它的2个点
整个三角形 - 记住它的 3 个点
删除重复点,然后你应该有一个四面体交点后的点列表(0,3
或 4
点)所以:
0
分 - 忽略
3
点 - 渲染三角形
4
点 - 渲染四面体
也有可能 1
和 2
点,但您可以忽略它们,除非您还想渲染无限细的线和点,在这种情况下渲染它们。有关详细信息,请检查上面 link 中的此函数:
void mesh4D::draw_cut(double w_cut)
它和我在这里描述的完全一样。唯一的问题是我们失去了多边形缠绕。但这可以通过在 normal_of_triangle
和矢量 center_of_triangle - center_of_tetrahedron
之间做点来修复,如果符号为负,则法线指向内部。因此,如果存在错误的方向,如果你知道你想要指向三角形点的相反顺序的方向。
到目前为止,我已经阅读了以下有关计算 4D 对象的 3D 相交点的内容:
Simple implementation of 4D cross-section
How do I get a 3D cross section of a 4D mesh?
但是,我真的很困惑这是怎么回事。我知道我需要计算 4D 对象的每个边缘(在我的例子中是 tesseract)与 3D space 相交的点,然后加入计算出的点,但是我不确定如何计算相交将完成。
如果有人可以解释他们将如何计算完整的 3D 横截面,那就太好了,但是我会对如何计算 1 个 4D 边的交点(如两个 4D 点之间的交点)感到满意。
(与我发现的第一个 link 中显示的不同,我希望能够在第 4 轴上的任何 w 坐标处执行此操作,因此一种计算方式可以保持 3D 的位置space 沿着 w 轴,以及 tesseract 本身的位置和方向)
谢谢
我在这里做了(你的第一个 link 是它的副本)
你会发现不仅仅是横截面,还有带有横截面渲染的 C++ 4D tesseract 示例(没有太)。
现在您要问的是如何计算几何边缘与轴对齐的 4D 超平面之间的交点 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
整条边都在平面内。
现在正如 linked 回答中提到的,这不涉及拓扑,因此您将获得点和边,但不会获得关于如何从它们构建 3D 几何的互连信息,并且需要进行彻底的分析这样做。更好的做法是以四面体的形式组织网格并检查其三角形的交点而不是单独检查边。
所以你检查了四面体每个三角形的 3 条边。每个三角形在相交后将转换为:
无 - 忽略
单点-记住了
单边-记住它的2个点
整个三角形 - 记住它的 3 个点
删除重复点,然后你应该有一个四面体交点后的点列表(0,3
或 4
点)所以:
0
分 - 忽略3
点 - 渲染三角形4
点 - 渲染四面体
也有可能 1
和 2
点,但您可以忽略它们,除非您还想渲染无限细的线和点,在这种情况下渲染它们。有关详细信息,请检查上面 link 中的此函数:
void mesh4D::draw_cut(double w_cut)
它和我在这里描述的完全一样。唯一的问题是我们失去了多边形缠绕。但这可以通过在 normal_of_triangle
和矢量 center_of_triangle - center_of_tetrahedron
之间做点来修复,如果符号为负,则法线指向内部。因此,如果存在错误的方向,如果你知道你想要指向三角形点的相反顺序的方向。