繁体   English   中英

如何简化行进方格网格?

[英]How to simplify a marching squares mesh?

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

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

在此输入图像描述

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

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

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

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

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

密集三角网格

在此输入图像描述

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

经过一些步骤后,您的网格将如下所示: 在此输入图像描述

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

立即执行此操作,从卷表示转到网格表示。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM