我有一个polychoron表示为四维网格,用face-vertex方法存储。所有的面都是三角形。如何获得该图的三维横截面?
我发现最接近的是this question,但这只是一个维度。
答案 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网格。
希望你看到这个比喻。
具体实现有点困难,你需要处理所有极端情况(除零情况,浮点错误等)。