[英]Troubling Recursive Fractal Mountain
我正在編寫一些 OpenGl 代碼來創建一個分形山。 我正在使用遞歸,並且遇到了困難。
我遇到的問題是三角形的撕裂和重疊: http : //imgur.com/DWSuUJH
問題是,我以為我已經解決了這個問題,這是我的代碼。
我的三角形類,vec2 只是一個通用的二維向量
struct Triangle {
vec2 A, B, C;
Triangle(vec2 a, vec2 b, vec2 c) {
A = a;
B = b;
C = c;
};
這是我的遞歸函數,它最初在默認視圖體積中使用頂點 (-1, -1)、(0, 1) 和 (1, -1) 的三角形調用。
void divide_triangle(const Triangle& baseTriangle, int count) {
if (count > 0) {
std::vector<Triangle> subTriangles = subdivideTriangle(baseTriangle);
for (int i = 0; i < subTriangles.size(); i++) {
divide_triangle(subTriangles[i], count - 1);
}
}
else {
triangle(baseTriangle); // Draw triangle at the end of recursion
}
這是我的 subDivideTriangles 函數,它簡單地將傳遞的三角形分成四個單獨的三角形
std::vector<Triangle> subdivideTriangle(const Triangle& triangle){
vec4 aPrime = getMidpoint(triangle.B, triangle.C);
vec4 bPrime = getMidpoint(triangle.C, triangle.A);
vec4 cPrime = getMidpoint(triangle.A, triangle.B);
return{
{ Triangle(triangle.A, cPrime, bPrime) }, // Top triangle
{ Triangle(cPrime, triangle.B, aPrime) }, // Bottom left triangle
{ Triangle(bPrime, aPrime, triangle.C) }, // Bottom right triangle
{ Triangle(cPrime, aPrime, bPrime) } // Center triangle
};
這是我認為可以停止撕裂的函數,我跟蹤與一對向量相對應的中點值,如果找到相應的向量對,則返回原始中點,因此不會移動中點兩次。
然而,這種方法似乎並不像我想象的那樣奏效。
vec4 getMidpoint(const vec4& a, const vec4& b) {
auto AB = std::make_pair(a, b), BA = std::make_pair(b, a);
auto foundResult1 = memo.find(AB);
auto foundResult2 = memo.find(BA);
if (foundResult1 != memo.end())
return memo[AB];
if (foundResult2 != memo.end())
return memo[BA];
auto result = (a + b) / 2;
result += randVector() * getLength(a, b) * randomness;
memo.insert(std::make_pair(AB, result));
memo.insert(std::make_pair(BA, result));
return result;
你們有什么見解嗎,我的中點函數有問題嗎?
你的問題來自相鄰的邊緣。
假設您有兩個三角形 ABC 和 DBC,其中 BC 作為公共邊,並且您想通過添加一些嘈雜的中間點來修改它們。
根據三角形,您在 BC 的中間使用兩個不同的點。
E 和 F 必須相同。 否則就會出現很大的差距。 它在您的圖片上很容易看到。
在我看來,您應該使用索引頂點並使用表格(或任何方法)來查找給定邊的現有中間。 即:在 DBC 中計算 BC 中間的 F 時,我們檢查並發現它已作為 E 存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.