এই সমস্যাটি বেশিরভাগ সময় সমস্যাটি সনাক্ত করার চেষ্টা করার পরে, নিখুঁত হতাশার বাইরে এসেছিল ।
যদি আপনি উপরের ছবিটিতে চোখ রাখেন তবে আপনার দেখতে হবে যে আমার মিডপয়েন্ট ডিসপ্লেসমেন্ট অ্যালগরিদম অ্যালগরিদম সফলভাবে কাজ করছে (কিছুটা) সফলভাবে; কিছুটা সুসংগত শব্দ প্যাটার্ন উত্পাদন করতে।
যাইহোক, এটি চিত্রটিতে একটি কালো বিন্দুযুক্ত গ্রিড রেখে যাচ্ছে এবং কেন তা আমার কোনও ধারণা নেই। আমি এটি গণিতে একটি সমস্যা হওয়ার পূর্বেই ধারণা করতে পারি, তবে আমি এটি দেখতে পাচ্ছি না; এটি কোনও সম্ভাব্য সমস্যা হিসাবে কোনও অনলাইন সংস্থায়ও চিহ্নিত করা হয়নি; সুতরাং এই বাগটি শিকার হিসাবে কোনও সহায়তা প্রশংসিত হবে।
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.lightthouse3d.com/opengl/terrain/index.php?mpd2 ব্যতীত কোনও টিপস বা সংস্থান থাকে তবে আমি চাই মন্তব্য হিসাবে তাদের প্রশংসা।
সম্পাদনা:
ফ্যাবিয়ানদের পরামর্শ অনুসারে এটিই নতুন চিত্র t তবে এটিতে এখনও কিছু অদ্ভুত স্নিগ্ধতা রয়েছে যা আপনি সরাসরি দেখতে পাবেন (ছোট 'ডিম্পলগুলি' সর্বত্র)।
এই অদ্ভুত আচরণের কারণ কী হতে পারে? আপডেট হওয়া উত্স কোড: http://www.pastie.org/1924223
সম্পাদনা:
সীমিত চেক ত্রুটিটি খুঁজে পেতে ফ্যাবিয়ানকে অনেক ধন্যবাদ, আগ্রহীদের জন্য, এখানে বর্তমান সমাধানটি 512x512 পিএনজি হিসাবে দেওয়া হয়েছে। এবং বর্তমান উত্স কোড (ফ্যাবিয়ান দ্বারা সংশোধিত) ।
সম্পাদনা করুন (বছর পরে): পাইথন সংস্করণ https://gist.github.com/dcousens/5573724#file-mdp-py