我在Java中实现了菱形平方算法,但我并不完全满意作为高度图的结果。它形成了一个地段的“湖泊”-小面积的低高度。利用菱形平方算法生成高度,然后进行归一化处理。在下面的例子中,白色=高,黑色=低和蓝色是任何低于15高度的东西:海洋的占位符。

这张图片显示了未着色的高度图。

我怎样才能使地形平滑以减少湖泊的数量?
我研究了一个简单的盒子模糊函数(将每个像素设置为其邻居的平均值),但是这会产生奇怪的伪像,可能是因为菱形正方形的平方步。
不同的(也许是高斯的)模糊是合适的,还是我的实现有问题?This链接说钻石方块有一些固有的问题,但这些似乎不是定期间隔的工件,我的高度图上有16个(而不是4个)值。
发布于 2016-11-24 16:40:16
您的阈值算法需要更符合逻辑。你需要实际指定什么是要删除的大小,而不仅仅是高度。基本上,简单的阈值设定为“海平面”,低于这个水平的就是水。问题是,由于用于生成地形的算法是以一种随意的方式进行的,所以可以用水填充小区域。
要解决这个问题,您需要从根本上确定水的大小,并且只允许较大的区域。
一个简单的方法是不允许单个“像素”表示水。本质上,要么不要将它们设置为水(如果有水,可以使用每一个位表示的位图),或者简单地将级别提高。这应该会使大部分的单个像素从你的图像,并清除它相当多。
您可以将其扩展为N个像素(实质上表示区域)。基本上,你必须通过计数连接的像素来识别水区域的大小。问题在于,它允许长而薄的区域(这可能代表河流)。
因此,最好再往前走一步,分开计算宽度和长度。
例如,检测一个简单的像素
如果mapi,j<阈值&& (mapi-1,j-1 >阈值& mapi+1,j+1 >阈值),则面积=1。
将检测到孤立的像素。
您可以对此进行修改,以检测更大的组,并编写一个通用算法来测量任何大小的潜在“海洋”。然后,它应该是简单的得到任何高度图与任何最小(和最大)大小的海洋,你想要。下一步是“修复”(或使用位图)地图中可能低于海平面但未转换为实际水的部分。也就是说,因为我们通常期望海平面以下的东西含有水。通过使用位图,您可以允许水中的水或陆地上的水等。
如果您使用平滑,它可能工作同样好,但您仍然会遇到这样的问题。平滑减少了“海洋”的大小,但是一个大的海洋可能变成一个小的海洋,而一个小的海洋最终会变成一个单一的像素。根据地图的总体平均值,经过足够的迭代后,您可能会得到所有的水或所有的土地。模糊也减少了地图的细节。
好消息是,如果你用可控参数来设计你的算法,那么你就可以控制地图上有多少海洋,或者它们有多大,它们有多方形(如果你想的话是圆形的),或者可以使用多少水,等等。
你投入的努力越多,你就越能准确地模拟现实。最终,如果你想变得无限复杂,你可以考虑地形是如何形成的,等等。但是,当然,这些简单算法的全部目的是让它们在合理的时间内可以计算。
https://stackoverflow.com/questions/40789969
复制相似问题