我有一个用四面网格表示的多面体,用面顶点方法存储。所有的面孔都是三角形。如何获得该图的三维横截面?
处理4个维度有些困难。
解决该问题的唯一方法是找到尺寸的类比。
让我们从2D开始
凸2D多边形具有凸1D边:线段。
填充的凸多边形的横截面是线段。
计算与相交线的多边形边界的相交点,您将获得两个凸多边形的相交点,并且横截面将是一个线段。
为此,您可以轻松地变换坐标,因此可以在坐标系的Y轴上进行横截面处理。边的两个点是A和B。它们的坐标是a1,a2和b1,b2。
如果a1和b1的符号相同,(又名a1 * b1> 0),则边缘不会与Y轴相交。
否则计算k = a1 /(a1-b1)。
那么交点的坐标将是:(0;(1-k)* a2 + k * b2)
正如我对凸多边形所说的那样,您将获得两个交点,将两个点连接起来即可获得一维横截面。
现在让我们推广到3D
凸3D网格具有凸2D边:三角形。
再次,变换坐标以简化操作。让我们获取YZ平面上的网格的横截面,因此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“侧面”:四面体。(请注意,您的面部-顶点表示可能不正确)
再次,变换坐标以简化操作。让我们获取YZW超平面上的网格的横截面,因此X坐标将再次为零。
得到四面体的横截面。针对他们的每个面孔使用上述算法。由于我们有4个维度,因此边缘的端点将具有坐标a1,a2,a3,a4和b1,b2,b3,b4。如果a1 * b1 <0,我们有一个交点。所以
相交点的坐标为(0;(1-k) a2 + k * b2;(1-k) a3 + k * b3;(1-k)* a4 + k * b4)。
对于四面体的每个三角形,这将产生一个线段。对于每个四面体,这将产生一个三角形。对于这些三角形的每个边缘,还存储线段所源自的3D网格的三角形的A,B和C点的索引(面索引)。以后会有用。
现在,您需要将这些横截面三角形连接到3D网格。这就是为什么我们将面部索引与相交边缘一起存储的原因。您有一组三角形,可以通过存储的面索引来匹配它们的边缘,因此可以将它们连接到三角形网格中。
对于凹面4D网格,您可能会有多个3D网格。
希望您能看到类比。
具体的实现会有些困难,您需要注意所有极端情况(除以零情况,浮点错误等)。