คำถามนี้ส่วนใหญ่มาจากความสิ้นหวังที่แท้จริงหลังจากใช้เวลาหลายชั่วโมงพยายามที่จะเข้าใจปัญหา
หากคุณละสายตาไปที่รูปภาพด้านบนคุณจะเห็นว่าอัลกอริทึมการแทนที่ตำแหน่งกลางของฉันทำงานได้สำเร็จ ในการผลิตรูปแบบเสียงค่อนข้างสอดคล้องกัน
อย่างไรก็ตามมันทิ้งไว้ข้างหลังจุดประสีดำบนภาพและฉันก็ไม่รู้ว่าทำไม ฉันคาดการณ์ได้ว่านี่เป็นปัญหาในวิชาคณิตศาสตร์ แต่ฉันมองไม่เห็น และนี่ไม่ได้ชี้ให้เห็นในแหล่งข้อมูลออนไลน์ใด ๆ ว่าเป็นปัญหาที่เป็นไปได้; ดังนั้นความช่วยเหลือใด ๆ จะได้รับการชื่นชมว่าจะตามล่าข้อผิดพลาดนี้
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
แก้ไข:
ขอบคุณมากเฟเบียนในการค้นหาข้อผิดพลาดการตรวจสอบขอบเขตสำหรับผู้ที่สนใจนี่คือทางออกปัจจุบันเป็น 512x512 png และซอร์สโค้ดปัจจุบัน (แก้ไขโดยเฟเบียน)(แก้ไขโดยเฟเบียน)
แก้ไข (หลายปีต่อมา): Python เวอร์ชั่นhttps://gist.github.com/dcousens/5573724#file-mdp-py