这是对一个没有回答的问题的重新发布
基本上我正在尝试为具有以下格式的 map 建模:
每个笔刷都定义了一个实心区域。画笔将此区域定义为四个或更多平面的交集。每个平面由三个非共线点定义。这些点必须按顺时针方向:
1--2-----------------> | 3 | | | | | ,
每个画笔语句如下所示:
{ ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) //plane 1 ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) //plane 2 ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) //plane 3 ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) //plane 4 ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) //plane 5 ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 )//plane 6 }
当您第一次看到它时,可能会有点困惑。它定义了一个从 (128,128,64) 延伸到 (256,384,128) 的矩形区域。这是单行的意思:
( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) 1st Point 2nd Point 3rd Point
我需要找到平面的交点,这样我就可以只使用一种可以在 3d 空间中绘制 2d 面板的方法来绘制形状。 例如,以下代码将在空间中绘制一个三角形:
beginShape(); vertex(x0,y0,z0); vertex(x1,y1,z1); vertex(x2,y2,z2); vertex(x0,y0,z0); endShape();
有没有比遍历所有可能的平面交叉点更好的方法来计算顶点?
最佳答案
我认为没有其他选择:关于顶点的唯一信息包含在平面中,从平面获取顶点的唯一方法是确定它们的交点,因此您必须遍历各种可能性。
开始:
如果您确定这些平面确实限制了一个体积,并且没有一个平面是平行的,那么 3 个相邻平面的每个组合都应该产生一个顶点(只需同时求解 plane equation所有 3).您可以很容易地消除体积外的顶点(要成为形状的一部分,它们必须在所有平面上或“后面”)所以如果您没有这种“邻接”,您可以只测试 3 的每个组合信息并丢弃外部点。
令我震惊的是,使用此方法您将只有 convex 体积 - 因此您可能只需在所有这些顶点上执行 3d convex hull 以获得可绘制的面三角形。
关于c++ - 如何获取平面描述的多边形的顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3779017/