이 문제는 문제를 파악하기 위해 몇 시간을 소비 한 후 주로 절망적 인 상황 에서 나왔습니다.
위 그림을 보시면 저의 중간 변위 알고리즘 알고리즘이 성공적으로 작동하는 것을 볼 수 있습니다. 다소 일관성있는 노이즈 패턴을 생성합니다.
그러나 이미지에 검은 점선 격자가 남고 있으며 이유를 모릅니다. 나는 이것이 수학의 문제라고 생각할 수는 있지만 그것을 볼 수는 없습니다. 이것은 온라인 자원에서 가능한 문제로 지적되지도 않았다. 따라서이 버그를 사냥하는 데 도움이 될 것입니다.
unsigned char** mdp(unsigned char** base, unsigned base_n, unsigned char r) {
size_t n = (2 * base_n) - 1;
unsigned char** map = new unsigned char*[n];
for (unsigned i = 0; i < n; ++i) map[i] = new unsigned char[n];
// Resize
// 1 0 1
// 0 0 0
// 1 0 1
for (size_t i = 0; i < n; i += 2) {
for (size_t j = !(i % 2 == 0); j < n; j += 2) {
map[i][j] = base[i / 2][j / 2];
}
}
// Diamond algorithm
// 0 0 0
// 0 X 0
// 0 0 0
for (size_t i = 1; i < n; i += 2) {
for (size_t j = 1; j < n; j += 2) {
unsigned char& map_ij = map[i][j];
unsigned char a = map[i - 1][j - 1];
unsigned char b = map[i - 1][j + 1];
unsigned char c = map[i + 1][j - 1];
unsigned char d = map[i + 1][j + 1];
map_ij = (a + b + c + d) / 4;
unsigned char rv = std::rand() % r;
if (map_ij + r < 255) map_ij += rv; // EDIT: <-- thanks! the bug! `map_ij + rv`, not `r`
else map_ij = 255;
}
}
// Square algorithm
// 0 1 0
// 1 0 1
// 0 1 0
for (size_t i = 0; i < n; ++i) {
for (size_t j = (i % 2 == 0); j < n; j += 2) {
unsigned char& map_ij = map[i][j];
// get surrounding values
unsigned char a = 0, b = a, c = a, d = a;
if (i != 0) a = map[i - 1][j];
if (j != 0) b = map[i][j - 1];
if (j + 1 != n) c = map[i][j + 1];
if (i + 1 != n) d = map[i + 1][j];
// average calculation
if (i == 0) map_ij = (b + c + d) / 3;
else if (j == 0) map_ij = (a + c + d) / 3;
else if (j + 1 == n) map_ij = (a + b + d) / 3;
else if (i + 1 == n) map_ij = (a + b + c) / 3;
else map_ij = (a + b + c + d) / 4;
unsigned char rv = std::rand() % r;
if (map_ij + r < 255) map_ij += rv;
else map_ij = 255;
}
}
return map;
}
당신이 아닌 다른 조언 자원이있는 경우 http://www.gameprogrammer.com/fractal.html을 하고프랙탈 기반 지형 생성에 대한 http://www.lighthouse3d.com/opengl/terrain/index.php?mpd2 의견으로도 감사합니다.
편집하다:
이것은 Fabians 제안 (ty)에 따라 새로운 이미지이지만, 여전히 이상한 점이 있습니다. 이곳은 바로 볼 수 있어야합니다 (모든 곳에서 작은 '딤플').
이 이상한 행동을 일으키는 원인은 무엇입니까? 업데이트 된 소스 코드 : http://www.pastie.org/1924223
편집하다:
경계 검사 오류를 발견 한 Fabian 덕분에 관심이있는 사람들을 위해 512x512 png와 같은 현재 솔루션이 있습니다. 그리고 현재 소스 코드 (Fabian에 의해 수정 됨) .
편집 (몇 년 후) : Python 버전 https://gist.github.com/dcousens/5573724#file-mdp-py