我正在寻找一种将常规网格高度(例如1024x1024)转换为三角形不规则网络的算法。这是一个显示三角形不规则网络示例的图像:
我在互联网上寻找转换它的算法,但我找不到一个。基本上三角形密度取决于粗糙度和/或像素误差(栅格化时)或类似的东西。
答案 0 :(得分:0)
这是一个两步算法的想法:首先基于粗糙网格进行Delaunay三角剖分,然后递归地平滑三角形,直到满足某个误差标准。
第一步,确定Delaunay三角剖分的一组顶点。这些顶点与像素坐标重合。高于或低于所有四个相邻像素的极点应该在该组中应该是边界上的脊点,其中沿着边界的相邻像素要么更低或更高。这应该给出粗三角形网格。您还可以通过包含具有高曲率的像素来获得更精细的网格。
在第二步中,遍历所有三角形。沿着像素网格扫描三角形,并为三角形内的每个像素累积误差平方,并识别最大和最小有符号误差的点。如果每个像素的平均误差不符合您的标准,请将最低和最高误差点添加到三角测量中。验证新三角形并根据需要重新进行三角测量。
注意:
第一步中的粗三角测量应该相当快。如果高度贴图很粗糙,您可能会在参差不齐的区域中得到太多顶点。在这种情况下,在应用算法之前,可以使用高斯滤波器对高度图进行平滑。
递归重新三角测量可能不那么快,因为确定误差需要一遍又一遍地扫描三角形。 (当三角形尺寸减小时,该过程应该变得更快,但仍然如此。)在步骤1中找到顶点的一个好标准可能会加快第2步。
您可以通过查找像素的边界框来扫描三角形。找到边界框左下角的重心坐标s,t以及对应于像素在x和y方向上移动的重心增量(dsx,dtx)和(dsy,dty)。然后,您可以在包含的像素(x,y)上的两个循环中扫描边界框,从delta矢量计算重心坐标(s,t),如果在三角形内,则积累误差,即当s> 1时。 0,t> 0和s + t < 1。
我还没有实现这个算法(但是 - 这是一个有趣的任务),但我想在速度和网格质量之间找到一个很好的平衡是一个定制错误标准和顶点选择到当前高度图的问题。 / p>