Pertanyaan ini muncul terutama karena putus asa , setelah menghabiskan beberapa jam mencoba mencari tahu masalahnya.
Jika Anda mengarahkan mata ke gambar di atas, Anda akan melihat bahwa algoritma algoritma perpindahan titik tengah saya berhasil (agak) berhasil; dalam menghasilkan pola kebisingan yang agak koheren.
Namun, itu meninggalkan grid bertitik hitam pada gambar, dan saya tidak tahu mengapa. Saya bisa meramalkan ini menjadi masalah dalam matematika, tetapi saya tidak bisa melihatnya; ini juga tidak ditunjukkan dalam sumber daya online sebagai masalah yang mungkin; jadi bantuan apa pun akan dihargai untuk memburu bug ini.
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;
}
Jika Anda memiliki kiat atau sumber daya selain http://www.gameprogrammer.com/fractal.html dan http://www.lighthouse3d.com/opengl/terrain/index.php?mpd2 untuk pembuatan medan berbasis fraktal, saya akan hargai mereka sebagai komentar juga.
Edit:
Ini adalah gambar baru, sesuai saran Fabian (ty), namun masih memiliki beberapa keanehan aneh, yang seharusnya dapat Anda lihat langsung ('lesung pipit' kecil di mana-mana).
Apa yang bisa menyebabkan perilaku aneh ini? Kode sumber yang diperbarui: http://www.pastie.org/1924223
Edit:
Banyak terima kasih kepada Fabian dalam menemukan kesalahan pemeriksaan batas, bagi mereka yang tertarik, berikut adalah solusi saat ini sebagai 512x512 png. Dan kode sumber saat ini (dimodifikasi oleh Fabian) .
Sunting (tahun kemudian): Versi Python https://gist.github.com/dcousens/5573724#file-mdp-py