c++ - 如何获取平面描述的多边形的顶点

标签 c++ graphics 3d

这是对一个没有回答的问题的重新发布

基本上我正在尝试为具有以下格式的 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/

相关文章:

c++ - C++ 中的 4d 映射与元组

c++ - QGraphicsScene::removeItem: item场景和这个场景不一样

c++ - 为什么许多标准实现允许将值直接分配给 ostream_iterator?

c++ - 如何在 C 中模仿 C++ "pass array(pointer) by reference"?

c++ - QGraphicsPixmapItem mouseMoveEvent 不抓取时

java - 之间的区别。图形填充矩形和清除矩形

java - 计算 3D 空间中相对于另一个点的点

java - 如何知道 paintComponent(Graphics g) 已经完成它的工作 (Java)?

3d - 《魔兽世界》如何处理装甲交换的图形?

javascript - 用体素生成球体