【发布时间】:2017-05-22 13:32:14
【问题描述】:
我在空闲时间正在做的事情有点问题: 我想通过 DSA 在 C++ 中创建一个高度图。但它没有按我的计划工作。 我的代码是(请忽略两个字符 cmets):
void DiamondSquareAlgorithm(int x1, int y1, int x2, int y2, float range, unsigned level)
{
//level = size - 1 when called the first time
if (level < 1) return;
float a;
float b;
float c;
float d;
float e;
for (int i = x1; i < x2; i += level)
{
for (int j = y1; j < y2; j += level)
{
//diamond
a = startArr[i + j * (x2 - x1 + 1)]; //lo
b = startArr[(i + level) + j * (x2 - x1 + 1)]; //ro
c = startArr[i + (j + level) * (x2 - x1 + 1)]; //lu
d = startArr[(i + level) + (j + level) * (x2 - x1 + 1)]; //ru
e = startArr[(i + level / 2) + (j + level / 2) * (x2 - x1 + 1)] = (a + b + c + d) / 4;
}
}
for (int i = x1; i < x2; i += level)
{
for (int j = y1; j < y2; j += level)
{
a = startArr[i + j * (x2 - x1 + 1)]; //lo
b = startArr[(i + level) + j * (x2 - x1 + 1)]; //ro
c = startArr[i + (j + level) * (x2 - x1 + 1)]; //lu
d = startArr[(i + level) + (j + level) * (x2 - x1 + 1)]; //ru
e = startArr[(i + level / 2) + (j + level / 2) * (x2 - x1 + 1)] = (a + b + c + d) / 4;
//square
startArr[(i + level / 2) + j * (x2 - x1 + 1)] = (a + b + e) / 3; //o
startArr[(i + level) + (j + level / 2) * (x2 - x1 + 1)] = (b + d + e) / 3; //r
startArr[(i + level / 2) + (j + level) * (x2 - x1 + 1)] = (d + c + e) / 3; //u
startArr[i + (j + level / 2) * (x2 - x1 + 1)] = (a + c + e) / 3; //l
}
}
DiamondSquareAlgorithm(x1, y1, x2, y2, range / 2, (level / 2));
};
结果总是这样的:
有人可以帮我找出我在代码中犯的明显严重错误吗?
【问题讨论】:
-
我不确定是什么问题。您应该尝试添加整个代码。我不确定
startArr的大小(计算上的偏移量)和参数或输出。您可以将代码添加到:ideone.com 吗? -
不要理解第 11 行到第 22 行的代码块是什么。只需将值分配给
a, b, c, d, e -
代码末尾的分号不是问题吗? (那不应该编译)
-
这里发生了几件事。您的算法仅在
x1和y1为零时才有效,否则索引平面数组将不正确。你也应该在level <= 1时停止递归;当level == 1时,您将覆盖左侧和顶部单元格。你的第一个循环,正方形,是正确的,但菱形不是。钻石也需要四个源单元格,但可能在边界处除外。您的右侧和底部中点将被随后的左侧和顶部中点覆盖。
标签: c++ algorithm game-engine terrain