Câu hỏi này chủ yếu xuất phát từ sự tuyệt vọng , sau khi dành nhiều giờ cố gắng tìm ra vấn đề.
Nếu bạn đưa mắt vào bức ảnh trên, bạn sẽ thấy thuật toán chuyển vị trung điểm của tôi đang hoạt động (phần nào) thành công; trong việc tạo ra một mô hình tiếng ồn hơi mạch lạc.
Tuy nhiên, nó đang để lại một lưới chấm đen trên hình ảnh, và tôi không biết tại sao. Tôi có thể thấy trước đây là một vấn đề trong toán học, nhưng tôi không thể thấy nó; điều này cũng không được chỉ ra trong bất kỳ tài nguyên trực tuyến nào là một vấn đề có thể xảy ra; vì vậy bất kỳ trợ giúp sẽ được đánh giá cao để săn lùng lỗi này.
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;
}
Nếu bạn có bất kỳ mẹo hoặc tài nguyên nào khác ngoài http://www.gameprogrammer.com/fractal.html và http://www.lighthouse3d.com/opengl/terrain/index.php?mpd2 để tạo địa hình dựa trên fractal, tôi sẽ đánh giá cao họ như ý kiến cũng.
Biên tập:
Đây là hình ảnh mới, theo gợi ý (ty) của Fabians, tuy nhiên nó vẫn có một số điểm kỳ lạ, mà bạn sẽ có thể nhìn thấy ngay lập tức ('lúm đồng tiền' nhỏ ở mọi nơi).
Điều gì có thể gây ra hành vi kỳ lạ này? Mã nguồn được cập nhật: http://www.pastie.org/1924223
Biên tập:
Rất cám ơn Fabian trong việc tìm ra lỗi kiểm tra giới hạn, đối với những người quan tâm, đây là giải pháp hiện tại là 512x512 png. Và mã nguồn hiện tại (được sửa đổi bởi Fabian) .
Chỉnh sửa (năm sau): Phiên bản Python https://gist.github.com/dcousens/5573724#file-mdp-py