如何简化行进方格网格?

时间:2013-07-27 09:50:34

标签: c# opengl mesh triangulation marching-cubes

我在iso平面上运行marching squares(相对于行进立方体)算法,然后将数据转换为三角形网格。

这可行,但会创建非常复杂的网格数据。我想将其简化为所需的最小三角形,如下图所示:

enter image description here

我尝试在轮廓周围循环(点 - >段 - >点 - > ...),但如果一个点有超过2个附加段,则轮廓可能会反转。

理想情况下,解决方案应该相当快,以便可以在运行时完成。我使用的语言是C#,但可能会从大多数其他类C语言中移植它。

4 个答案:

答案 0 :(得分:6)

这是3D计算机图形中非常常见的问题。解决该问题的算法称为网格简化算法。 然而,在2D情况下解决问题要简单得多,因为不需要考虑表面法线。

第一个重要的是拥有一个可靠的网格数据结构,它提供修改网格的操作。可以生成和修改任何网格的一组操作例如是“Euler Operators”的集合。

为了简化2D网格,提供密集版本的2D网格。 您可以简单地将四边形网格转换为三角形网格 将每个四边形分成对角线。

密集的三角形网格

enter image description here

然后迭代地折叠不在边界处的最短边。 “边缘折叠”是典型的网格操作,如下所示: The edge collapse operation

经过一些步骤后,您的网格将如下所示: enter image description here

答案 1 :(得分:3)

简化由行进方块生成的网格(如上面的答案中所建议的)非常低效。要从标量场(例如位图)中获取多边形,您应首先运行仅生成多边形轮廓的行进方块的修改版本(即在16个行进方块中不生成几何图形,只需添加点到多边形),然后运行三角测量算法(例如Delaunay或Ear Clipping)。

答案 2 :(得分:0)

立即执行此操作,从您的音量表示转到网格表示。

之后,您可以将案例3,6,9,12的区域分组为更大/更长的版本。

您可以尝试将方块分组为更大的方块,但它是NP问题,因此理想的优化可能需要很长时间。

然后您可以将其转换为多边形版本。

将其转换为多边形后,您可以融合边缘。

答案 3 :(得分:0)