分形樹是分形幾何中最直觀的例子,模擬自然界樹木生長:每個線段末端按固定角度、縮放比例分叉生成兩條新線段,遞歸迭代形成自相似結構。
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 | 控制遞歸層數,即樹的精細度 |
GL_LINES;此算法是程序化植被生成的基石,廣泛應用於遊戲地形、虛擬現實場景與計算機圖形學教學演示中。