首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

分形幾何:二叉樹分形的遞歸生成算法與核心代碼實現

     編輯:C++ 入門

分形幾何:二叉樹分形的遞歸生成算法與核心代碼實現

分形樹是分形幾何中最直觀的例子,模擬自然界樹木生長:每個線段末端按固定角度、縮放比例分叉生成兩條新線段,遞歸迭代形成自相似結構。

幾何參數定義

  • vStart, vEnd:當前線段起止點(Vector3);
  • angle:分叉角度(弧度);
  • branch_c:長度縮放係數(新線段長 = 當前長 × branch_c);
  • pVertices[4]:輸出兩條新線段的 4 個端點。

核心生成函數

static void FractalBinaryTree(const Vector3& vStart, const Vector3& vEnd,
                              Yreal angle, Yreal branch_c, Vector3* pVertices) {
    Vector3 vSub = vEnd - vStart;
    Yreal len = D3DXVec3Length(&vSub);
    Yreal alfa = atan2f(vSub.y, vSub.x);          // 當前線段朝向角

    Yreal branch = len * branch_c;                // 新線段長度

    // 第一條分支:朝向 alfa - angle
    pVertices[0] = vEnd;
    pVertices[1].x = pVertices[0].x + branch * cosf(alfa - angle);
    pVertices[1].y = pVertices[0].y + branch * sinf(alfa - angle);
    pVertices[1].z = 0.0f;

    // 第二條分支:朝向 alfa + angle
    pVertices[2] = vEnd;
    pVertices[3].x = pVertices[2].x + branch * cosf(alfa + angle);
    pVertices[3].y = pVertices[2].y + branch * sinf(alfa + angle);
    pVertices[3].z = 0.0f;
}

遞歸構建完整樹

void BuildTree(Vector3 start, Vector3 end, int depth, int maxDepth,
               Yreal angle, Yreal branch_c, vector>& segments) {
    if (depth > maxDepth) return;
    segments.emplace_back(start, end);

    Vector3 verts[4];
    FractalBinaryTree(start, end, angle, branch_c, verts);

    // 左分支
    BuildTree(verts[0], verts[1], depth+1, maxDepth, angle, branch_c, segments);
    // 右分支
    BuildTree(verts[2], verts[3], depth+1, maxDepth, angle, branch_c, segments);
}

參數調整效果

參數效果
angle 大樹冠展開,形似橡樹
angle 小樹冠收斂,形似杉樹
branch_c 接近 1分支緩慢遞減,樹高聳
branch_c 較小分支快速變短,樹矮胖
maxDepth控制遞歸層數,即樹的精細度

渲染建議

  1. 收集所有線段端點對,一次性提交 GPU(VBO/IBO)繪製 GL_LINES;
  2. 可為不同層級賦予顏色漸變(樹幹深褐 → 樹葉綠);
  3. 添加隨機擾動(角度 ±5%、長度 ±10%)增強自然感;
  4. 結合 L-System 文法可生成更豐富的植物形態。

此算法是程序化植被生成的基石,廣泛應用於遊戲地形、虛擬現實場景與計算機圖形學教學演示中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved