gpt4 book ai didi

c++ - 平整湖泊周围的土地

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:05 24 4
gpt4 key购买 nike

抱歉,如果该标题描述性不强。无论如何,我正在研究处理随机生成景观的东西。我制作了湖泊,但由于它们的制作方式,它们通常会导致直边/下降,这是不可取的。我试图通过定义一个最大变化量(所以土地高度不能超过它)来平滑它(如果可能的话,在制作湖泊之后),如果它变化很大就让它修复土地,如果它是退出美好的。

问题:

Large dropoff

我尝试的修复:

Attempted fix

如您所见...它没有用。我也想到了,我认为如果它必须向下移动它就会被破坏,尽管这种情况实际上不应该发生,因为湖泊只会使景观下沉。无论如何,这是我尝试的来源:

//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;

请注意,这只是右侧,但左侧应该大致相同。我怎样才能正确地做到这一点?

谢谢,如果你能帮忙。

编辑:

我从来没有解决过这个问题。相反,我做了一个递归函数来测量空气,(从一定高度),如果空气袋(由土地形成)足够,就充满水。这具有土地看起来平坦的优势,因为它没有被改变。

最佳答案

这是用 Java 编写的,因此您需要将其转换为 C++,但它应该能为您提供基本概念。它也只适用于向上平滑,我只做了湖的右侧,但很容易为湖的左侧修改它。我试图匹配我认为你的代码的功能。

希望对你有帮助

void smoothLakeRight(Lake lake){

int x = lake.rightBound+1;

if(getGrassHeight(x)-lake.height>WorldConstants.MAX_LAKESIDE_VARIATION){
//if the right bank is too high start smoothing
int y =lake.height+WorldConstants.MAX_LAKESIDE_VARIATION;

while(grid[0][x][y] == BlockColor.DIRT){
fixGrass(x++, y++);
}
}
}

private int getGrassHeight(int xPos){

int y = WorldConstants.LOWEST_GRASS;

while(grid[0][xPos][y++] != BlockColor.GRASS);

return y-1;
}

private void fixGrass(int xPos, int yPos){

grid[0][xPos][yPos] = BlockColor.GRASS;

aboveAir(xPos,yPos);
belowDirt(xPos, yPos);

}

private void aboveAir(int xPos, int yPos) {

while(grid[0][xPos][++yPos]!=BlockColor.AIR){
if(grid[0][xPos][yPos]==BlockColor.TREE){
upRootTree(xPos, yPos);
}else{
grid[0][xPos][yPos]=BlockColor.AIR;
}
}
}

private void upRootTree(int xPos, int yPos) {

while(grid[0][xPos][yPos]==BlockColor.TREE){//remove stump
grid[0][xPos][yPos++]=BlockColor.AIR;
}

//remove leaves
grid[0][xPos][yPos] = BlockColor.AIR;
grid[0][xPos+1][yPos] = BlockColor.AIR;
grid[0][xPos-1][yPos] = BlockColor.AIR;
grid[0][xPos+1][yPos-1] = BlockColor.AIR;
grid[0][xPos-1][yPos-1] = BlockColor.AIR;
}

private void belowDirt(int xPos, int yPos) {

while(grid[0][xPos][--yPos]!=BlockColor.DIRT){
grid[0][xPos][yPos] = BlockColor.DIRT;
}
}

关于c++ - 平整湖泊周围的土地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com