【发布时间】:2013-07-11 17:02:27
【问题描述】:
抱歉,如果该标题描述性不强。无论如何,我正在研究处理随机生成的景观。我制作了湖泊,但由于它们的制作方式,它们经常导致直边/下降,这是不可取的。我正在尝试通过定义最大变化量(因此土地高度的变化不能超过它)来平滑它(如果可能的话,就在造湖之后),如果它变化很大,让它固定土地,如果它是退出美好的。
问题:
我尝试的修复:
如您所见...它不起作用。我也想到,如果它不得不向下移动,我认为它会被打破,尽管这种情况实际上不应该发生,因为湖泊只会沉没景观。无论如何,这是我尝试的来源:
//smoothing land nearby
int maxVariation = 2; //similar to the max height variation when the land is generated
//going right
for (int xPos = rightBound + 1, previousHeight = 0; ; ++xPos)
{
if (previousHeight == 0)
for (; previousHeight < size.y; ++previousHeight)
if (grid[0][rightBound][previousHeight] != BlockColor::DIRT && grid[0][rightBound][previousHeight] != BlockColor::GRASS)
{
--previousHeight;
break;
}
for (int y = 0; y < size.y; ++y)
if (grid[0][xPos][y] == BlockColor::WATER)
goto done_smoothing_right;
int height;
for (height = 0; height < size.y; ++height)
if (grid[0][xPos][height] != BlockColor::DIRT && grid[0][xPos][height] != BlockColor::GRASS)
{
--height;
break;
}
int difference = std::abs(height - previousHeight);
previousHeight = height;
if (difference > maxVariation)
{
for (int j = 0; j < size.y; ++j)
{
int toMove = difference;
while (j + toMove >= size.y)
--toMove;
grid[0][xPos][j] = grid[0][xPos][j + toMove];
}
}
else
goto done_smoothing_right;
}
done_smoothing_right:
int tomakegotowork;
请注意,这只是右侧,但左侧应该大致相同。我怎样才能正确地做到这一点?
如果你能帮忙,谢谢。
编辑:
我从来没有解决过这个问题。相反,我做了一个递归函数来测量空气,(从某个高度),如果一个空气袋(由土地形成)有足够的,可以装满水。这样做的好处是土地看起来很光滑,因为它没有被改变。
【问题讨论】:
-
rightBound 是湖的 rightBound 吗?湖泊只出现在高度 0 处吗?
-
@MikeSaull 是的,rightBound 是最右边水的 x。湖泊不仅出现在 0 时,而且以目前的陆地高度和湖泊深度,看起来确实如此。