我正在寻找一种将规则的高度网格(例如1024x1024)转换为三角形不规则网络的算法。这是一个显示三角形不规则网络示例的图像:
我在互联网上寻找一种算法来转换它,但我就是找不到。基本上,三角形密度取决于粗糙度和/或像素误差(光栅化时)或类似的东西。
我正在寻找一种将规则的高度网格(例如1024x1024)转换为三角形不规则网络的算法。这是一个显示三角形不规则网络示例的图像:
我在互联网上寻找一种算法来转换它,但我就是找不到。基本上,三角形密度取决于粗糙度和/或像素误差(光栅化时)或类似的东西。
只是一个想法。使用递归细分创建地图的良好表示。
假设要覆盖的区域是一个三角形。首先检查该三角形是否是内部高度的良好近似值。如果是,则将其留在网格中。如果不是,则选择三角形内的一个点并将其分成三个三角形并继续进行。
检查三角形近似值很容易,计算高度曲线和三角形之间的体积。对于分割点,选择三角形中心更容易,但这种方法会产生非常规则的网格。也许可以使用一些统计方法来更快地覆盖数据中的颠簸。我认为使用平均位置是有道理的。
我认为网格简化算法可以满足您的需求。我假设大三角形将是一个区域中几乎共面的三角形的组合。
简化确实是最先出现的想法之一。但这不会像原生解决方案那样干净。
这种不规则性是使用 voronoi 镶嵌获得的,最初的问题归结为寻找点采样分布。
为了找到这些点,它可以以泊松分布的形式实现,密度由沿 x 和 y 的高度图的偏导数之和驱动。可以根据经验微调来调整度量(例如,max
而不是总和)。
如果分布遵循泊松分布,则该分布将更好地避免混叠,但可以应用其他模式,例如逐行扫描并根据导数的绝对值决定下一个距离的扫描线算法。然而,线之间的距离将是规则的,这将导致沿 x 的统计一致性,这不如 Karl 发布的原始图片。这就是我在这种情况下提出泊松的原因。
泊松分布可以通过在整个地图上使用正则均匀泊松来简化,然后根据导数绝对值最低的区域进行点剪枝。
剪枝可以分块决定,将整个区域预细分为数百个子块,并且对于每个块,取该块中导数图的大量采样的总和。如果该值较低,则随机修剪大量点。使用这种方法,块将有机会包含多个点,从而使修剪在统计上变得干净。但是,较大的块也会导致在具有高度变化的导数的区域中分辨率较差(原始高度图的二阶导数很强)。因此,应再次进行经验微调以确定块的理想大小。
为了缓解修剪块的问题,可以在启动时生成更多点,然后块可以小得多,这将在两个方面都有好处(良好的抗锯齿和良好的局部性)。但是,这将花费更多的 CPU 时间。
点分布确定后,就是经典的voronoi tesselator,google上有几百个。