यह सवाल मुख्य रूप से सरासर हताशा से बाहर आया है , कई घंटे बिताने के बाद समस्या का पता लगाने की कोशिश कर रहा है।
यदि आप ऊपर की तस्वीर के लिए अपनी आँखें डालते हैं, तो आपको देखना चाहिए कि मेरा मिडपॉइंट विस्थापन एल्गोरिथ्म एल्गोरिथ्म सफलतापूर्वक (कुछ हद तक) काम कर रहा है; कुछ हद तक सुसंगत शोर पैटर्न के उत्पादन में।
हालांकि, यह छवि पर एक काले बिंदीदार ग्रिड को पीछे छोड़ रहा है, और मुझे नहीं पता कि क्यों। मैं इसे गणित में एक मुद्दा होने की उम्मीद कर सकता हूं, लेकिन मैं इसे देख नहीं सकता; न ही यह संभव मुद्दे के रूप में किसी भी ऑनलाइन संसाधनों में बताया गया था; तो इस बग को शिकार करने के लिए किसी भी मदद की सराहना की जाएगी।
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.lIIIouse3d.com/opengl/terrain/index.php?mpd2 के अलावा कोई अन्य सुझाव है , तो भग्न आधारित भू-निर्माण पीढ़ी के लिए, मैं करूँगा उन्हें टिप्पणी के रूप में भी सराहना करते हैं।
संपादित करें:
फैबियंस के सुझाव (ty) के अनुसार यह नई छवि है, हालांकि इसमें अभी भी कुछ अजीब विचित्रताएं हैं, जिन्हें आपको सीधे (छोटे 'डिम्पल') हर जगह देखने में सक्षम होना चाहिए।
इस अजीब व्यवहार के कारण क्या हो सकता है? अपडेटेड सोर्स कोड: http://www.pastie.org/1924223
संपादित करें:
सीमा की जाँच में त्रुटि ढूंढने में फ़ेबियन के लिए बहुत धन्यवाद, दिलचस्पी रखने वालों के लिए, यहाँ मौजूदा समाधान 512x512 png है। और वर्तमान स्रोत कोड (फैबियन द्वारा संशोधित) ।
संपादित करें (वर्षों बाद): पायथन संस्करण https://gist.github.com/dcousens/5573724#file-mdp-py