钻石方形算法创建对角线切割
Diamond Square Algorithm creates diagonal cut
我在空闲时间正在做的事情上遇到了一些小问题:
我想通过 DSA 在 C++ 中创建一个高度图。但它没有按我的计划工作。
我的代码是(请忽略两个字符的注释):
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));
};
结果总是类似这样的:
谁能帮我找出我在代码中犯的明显严重的错误?
我终于找到了我的代码的问题。除了一件小事外,上面的大部分内容都是正确的:它不应该是 (x2 - x1 + 1)。这会将数组中的每个值进一步移动 space。每一步都会发生这种情况,因此会出现这条对角线;正确的工作代码是
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;
int width = x2 - x1;
for (int y = x1; y < x2; y += level)
{
for (int x = y1; x < y2; x += level)
{
//diamond
a = startArr[x + y * width]; //lo
b = startArr[(x + level) + y * width]; //ro
c = startArr[x + (y + level) * width]; //lu
d = startArr[(x + level) + (y + level) * width]; //ru
e = startArr[(x + level / 2) + (y + level / 2) * width] = Fit(((a + b + c + d) / 4) + Random(-1, 1) * range);
}
}
for (int y = x1; y < x2; y += level)
{
for (int x = y1; x < y2; x += level)
{
a = startArr[x + y * width]; //lo
b = startArr[(x + level) + y * width]; //ro
c = startArr[x + (y + level) * width]; //lu
d = startArr[(x + level) + (y + level) * width]; //ru
e = startArr[(x + level / 2) + (y + level / 2) * width];
//square
startArr[(x + level / 2) + y * width] = Fit(((a + b + e) / 3) + Random(-0.5, 0.5) * range); //o
startArr[(x + level) + (y + level / 2) * width] = Fit(((b + d + e) / 3) + Random(-0.5, 0.5) * range); //r
startArr[(x + level / 2) + (y + level) * width] = Fit(((d + c + e) / 3) + Random(-0.5, 0.5) * range); //u
startArr[x + (y + level / 2) * width] = Fit(((a + c + e) / 3) + Random(-0.5, 0.5) * range); //l
}
}
DiamondSquareAlgorithm(x1, y1, x2, y2, range / 2, (level / 2));
};
float Fit(float x)
是一种采用浮点数并将其与 0 和 1 进行比较的方法,因此没有大于 1 的值也没有小于 0 的值; float Random(float a, float b)
只是给你一个介于两个浮点数之间的随机浮点数。
heightfield
我在空闲时间正在做的事情上遇到了一些小问题: 我想通过 DSA 在 C++ 中创建一个高度图。但它没有按我的计划工作。 我的代码是(请忽略两个字符的注释):
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));
};
结果总是类似这样的:
谁能帮我找出我在代码中犯的明显严重的错误?
我终于找到了我的代码的问题。除了一件小事外,上面的大部分内容都是正确的:它不应该是 (x2 - x1 + 1)。这会将数组中的每个值进一步移动 space。每一步都会发生这种情况,因此会出现这条对角线;正确的工作代码是
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;
int width = x2 - x1;
for (int y = x1; y < x2; y += level)
{
for (int x = y1; x < y2; x += level)
{
//diamond
a = startArr[x + y * width]; //lo
b = startArr[(x + level) + y * width]; //ro
c = startArr[x + (y + level) * width]; //lu
d = startArr[(x + level) + (y + level) * width]; //ru
e = startArr[(x + level / 2) + (y + level / 2) * width] = Fit(((a + b + c + d) / 4) + Random(-1, 1) * range);
}
}
for (int y = x1; y < x2; y += level)
{
for (int x = y1; x < y2; x += level)
{
a = startArr[x + y * width]; //lo
b = startArr[(x + level) + y * width]; //ro
c = startArr[x + (y + level) * width]; //lu
d = startArr[(x + level) + (y + level) * width]; //ru
e = startArr[(x + level / 2) + (y + level / 2) * width];
//square
startArr[(x + level / 2) + y * width] = Fit(((a + b + e) / 3) + Random(-0.5, 0.5) * range); //o
startArr[(x + level) + (y + level / 2) * width] = Fit(((b + d + e) / 3) + Random(-0.5, 0.5) * range); //r
startArr[(x + level / 2) + (y + level) * width] = Fit(((d + c + e) / 3) + Random(-0.5, 0.5) * range); //u
startArr[x + (y + level / 2) * width] = Fit(((a + c + e) / 3) + Random(-0.5, 0.5) * range); //l
}
}
DiamondSquareAlgorithm(x1, y1, x2, y2, range / 2, (level / 2));
};
float Fit(float x)
是一种采用浮点数并将其与 0 和 1 进行比较的方法,因此没有大于 1 的值也没有小于 0 的值; float Random(float a, float b)
只是给你一个介于两个浮点数之间的随机浮点数。
heightfield