如何获得4D网格的3D横截面?

时间:2013-07-21 17:36:37

标签: algorithm language-agnostic geometry

我有一个polychoron表示为四维网格,用face-vertex方法存储。所有的面都是三角形。如何获得该图的三维横截面?

我发现最接近的是this question,但这只是一个维度。

1 个答案:

答案 0 :(得分:3)

使用4个维度有点困难。

解决问题的唯一方法是找到维度类比。

让我们从2D开始

凸二维多边形具有凸1D边:线段。

填充凸多边形的横截面是线段。

计算poligons边与交叉线的交点,你将获得凸多边形的两个交点,横截面将是一个线段。

要做到这一点,请轻松转换坐标,以便在坐标系的Y轴上进行横截面。边缘的两个点是A和B.它们的坐标是a1,a2和b1,b2。

如果a1和b1的符号相同,(也就是a1 * b1> 0),边缘将不会与Y轴相交。

否则计算k = a1 /(a1-b1)。

然后交点的坐标为:(0;(1-k)* a2 + k * b2)

正如我所说的凸多边形,你会得到两个交点,连接这两个点得到1D横截面。

现在让我们概括为3D

凸三维网格具有凸面2D边:三角形。

再次,转换坐标以使操作更容易。让我们在Y-Z平面上得到网格的横截面,这样X坐标将再次为零。

获取三角形的横截面。使用上面的算法为他们的每个边缘。 由于我们有3个维度,边缘的端点将具有坐标a1,a2,a3和b1,b2,b3。如果a1 * b1 <0,我们有一个交叉点。所以

设k = a1 /(a1-b1)

交点的坐标是(0;(1-k)* a2 + k * b2;(1-k)* a3 + k * b3)。存储此坐标,但也存储网格的A点和B点的索引(边缘索引)。它以后会很有用。

对于每个三角形,这将产生一个线段。

现在,您需要将这些横截面线段连接到多边形。这就是我们将边缘索引与交叉点一起存储的原因。您有一组线,您可以通过存储的边索引匹配它们的端点,因此您可以将它们连接到多边形。

现在让我们概括为4D

凸4D网具有凸3D“边”:四面体。 (注意你的面部顶点表示可能不正确)

再次,转换坐标以使操作更容易。让我们在Y-Z-W超平面上得到网格的横截面,这样X坐标将再次为零。

获取四面体的横截面。使用上面的算法为他们的每个面孔。 由于我们有4个维度,边缘的端点将具有坐标a1,a2,a3,a4和b1,b2,b3,b4。如果a1 * b1 <0,我们有一个交叉点。所以

设k = a1 /(a1-b1)

交点的坐标是(0;(1-k)* a2 + k * b2;(1-k)* a3 + k * b3;(1-k)* a4 + k * b4)。

对于四面体的每个三角形,这将产生线段。对于每个四面体,这将产生三角形。对于这些三角形的每个边缘,还存储线段源自的3D网格的三角形(面部索引)的A,B和C点的索引。它以后会很有用。

现在您需要将这些横截面三角形连接到3D网格。这就是我们将面部索引与交叉边缘一起存储的原因。你有一组三角形,你可以通过存储的面部索引匹配它们的边缘,这样你就可以将它们连接成三角形网格。

对于凹面4D网格,您可能会获得多个3D网格。


希望你看到这个比喻。

具体实现有点困难,你需要处理所有极端情况(除零情况,浮点错误等)。