簡體   English   中英

麻煩的遞歸分形山

[英]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 的中間使用兩個不同的點。

  • 當您在 ABC 上進行修改時,讓 E 成為 BC 的中間。
  • 當您在 DBC 上進行修改時,讓 F 成為 BC 的中間位置。

E 和 F 必須相同。 否則就會出現很大的差距。 它在您的圖片上很容易看到。

在我看來,您應該使用索引頂點並使用表格(或任何方法)來查找給定邊的現有中間。 即:在 DBC 中計算 BC 中間的 F 時,我們檢查並發現它已作為 E 存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM