计算4D形状的三维横截面(tesseract)

时间:2018-04-24 18:31:21

标签: algorithm language-agnostic geometry 4d

到目前为止,我已经阅读了以下关于计算4D物体的3D相交点的信息:

Simple implementation of 4D cross-section

How do I get a 3D cross section of a 4D mesh?

但是,我真的很困惑。我知道我需要计算4D物体的每个边缘(在我的情况下是一个tesseract)与3D空间相交的点,然后加入计算出的点,但是我不知道相交的计算是如何计算的。完成。

如果有人可以解释他们如何计算完整的3D横截面会很好,但是我会满意如何计算1 4D边的交点,就像在两个4D点之间的交点一样。

(与我发现的第一个链接中显示的不同,我希望能够在第4轴上的任何w坐标处执行此操作,因此一种计算方法可以保持3D空间沿w轴的位置介意,以及tesseract本身的位置和方向)

由于

1 个答案:

答案 0 :(得分:1)

我在这里做了(你的第一个链接是重复的)

你会发现不仅仅是横截面,还有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整个边缘在平面上。

现在如链接答案中所述,这不涉及拓扑结构,因此您将获得点和边,但不获取关于如何从中构造3D几何图形的互连信息,并且需要进行彻底的分析。更好的是以四面体的形式组织网格并检查其三角形的交叉而不是单独的边缘。

所以你检查每个四面体三角形的3个边缘。每个三角形在交叉后转换为:

  1. 没有 - 忽略

  2. 单点 - 记住它

  3. 单边 - 记住它的2点

  4. 整个三角形 - 记住它的3分

  5. 删除重复的点,之后你应该有一个交叉点后四面体的点(0,34点)列表,所以:

    1. 0分 - 忽略

    2. 3点 - 渲染三角形

    3. 4点 - 渲染四面体

    4. 还有12点的可能性,但你可以忽略它们,除非你想渲染无限细线和点,在这种情况下渲染它们。有关详细信息,请在上面的链接中检查此功能:

      void mesh4D::draw_cut(double w_cut)
      

      它完全按照我在这里描述的那样做。唯一的问题是我们失去了多边形绕组。但是,如果符号为负,法线指向内部,则可以通过在normal_of_triangle和向量center_of_triangle - center_of_tetrahedron之间进行点修复。所以如果你知道哪个方向你想要指向错误方向的三角形点的逆序。