Questa domanda è emersa principalmente per pura disperazione , dopo aver trascorso diverse ore a cercare di capire il problema.
Se guardi all'immagine sopra, dovresti vedere che il mio algoritmo di algoritmo di spostamento del punto medio funziona (in qualche modo) con successo; nel produrre un modello di rumore in qualche modo coerente.
Tuttavia, sta lasciando una griglia tratteggiata nera sull'immagine e non ho idea del perché. Posso prevedere che questo sia un problema in matematica, ma non riesco proprio a vederlo; né questo è stato indicato in alcuna risorsa online come possibile problema; così ogni aiuto sarà apprezzato per dare la caccia a questo bug.
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;
}
Se hai suggerimenti o risorse diversi da http://www.gameprogrammer.com/fractal.html e http://www.lighthouse3d.com/opengl/terrain/index.php?mpd2 per la generazione di terreni basati su frattali, vorrei apprezzali anche come commenti.
Modificare:
Questa è la nuova immagine, come suggerito da Fabians (ty), tuttavia ha ancora alcune strane stranezze, che dovresti essere in grado di vedere immediatamente (piccole 'fossette' ovunque).
Cosa potrebbe causare questo strano comportamento? Codice sorgente aggiornato: http://www.pastie.org/1924223
Modificare:
Mille grazie a Fabian nel trovare l'errore di controllo dei limiti, per chi fosse interessato, ecco la soluzione attuale come 512x512 png. E l' attuale codice sorgente (modificato da Fabian) .
Modifica (anni dopo): versione di Python https://gist.github.com/dcousens/5573724#file-mdp-py