程式設計畫出千姿百態的樹葉
走到戶外,欣賞大自然的美景,映入眼簾的是千姿百態,各種各樣美麗的樹。這不禁使人在心曠神怡之餘開始讚嘆大自然的偉大。於是就有了用電腦把這美景畫出來的衝動。
經過一番探索,程式編出來了,畫出的效果還真不少,如圖
1所示,筆者根據其形狀命名的有蕨葉、蘆葦、葉脈、文竹、大樹、嫩藤、小草、葡萄、迎客松、玫瑰花、五星花、蒲公英、塔、羽毛、鳳凰、孔雀、浪花、稻草人等。
仔細觀察它們的形狀有何規律,那就是自相似性,一棵樹分的乙個叉又是一棵小樹。
為了說明原理,筆者以二維情況下非常典型的一棵小樹為例來介紹畫圖的演算法。
設這棵樹發了兩個叉,如圖
2深色部分所示。沿著箭頭的方向,畫這棵樹需要如下步驟。
①首先從起點開始向前走到第乙個分叉點,設距離是l1;
②向左轉θ
1 ;
③畫子樹;
④向右轉回θ
1 ,然後再向左轉
θ,這個θ角相當於樹的曲度;
⑤繼續向前走
到第二個分叉點,又走了l2;
⑥向右轉θ
2 ;
⑦畫子樹;
⑧向左轉θ
2 ,考慮到如果樹枝下面還有枝節,應該再向左多轉
θ表示樹的曲度;
⑨向右轉回θ,後退l2,回到
第二個分叉點;
⑩向右轉回θ,後退l1,回到起點。
至此一棵完整的樹就誕生了。
演算法分析:在演算法中,③、⑦用到了遞迴方法,對自身進行呼叫,正是這一步驟模擬了自然界樹木生長的實質。⑨、
⑩兩個步驟為回溯演算法,保證畫完子樹之後能退回到
轉彎時的出發點。
對於一般的情況程式核心**如下:
sub leaf(byval n as integer, byval l as single)
'
蕨葉(n為遞迴深度,大小為l
)蕨葉和樹結構類似
dim i as integer 'i
是迴圈變數
if n = 0 then exit sub '
遞迴的結束條件
for i = branch to 1 step -1 'branch
指枝條數
fd l1 * i / branch * l
lt seta1
leaf n - 1, i / branch * l / k1 '
左子樹大小的比例係數為k1
rt seta1 – seta '
樹的曲度為
seta
fd l2 * i / branch * l
rt seta2
leaf n - 1, i / branch * l / k2 '
右子樹大小的比例係數為k2
lt seta2 + seta
next i
for i = 1 to branch '
回溯主葉幹
rt seta
bk l2 * i / branch * l
rt seta
bk l1 * i / branch * l
next i
end sub
程式說明:
本程式為多枝條樹的畫法,主要是用遞迴和迴圈來描述的。對於程式究竟是怎麼執行的,聰明的你還需要動腦去想一想,這可是使你更加深刻的理解遞迴和迴圈的好機會啊。
在程式中呼叫了一些稱為海龜作圖的函式,假設有乙隻聽話的小海龜在受你的控制,它能聽懂如下命令:
fd n,在當前位置上前進n步;bk n,在當前位置上後退n步;rt n,在當前位置上向右轉n度;lt n,在當前位置上向左轉n度。這些函式用vb的line
語句很好實現,這裡就不再詳細介紹了。
**可能比較枯燥,但看著這些美麗的效果你就會感受到程式設計的無窮樂趣了。
程式介面如圖
3所示:
在程式執行時可以方便的調節各個引數,通過調整比例係數可以改變子樹的大小,從而決定畫出的形狀更像是樹之還是樹葉;調整子樹的傾斜角度可以形成不同的樹種;在各個引數中曲度對樹的形狀影響最大,調整它可以生成不同類別的圖案。使用動畫按鈕還可觀察到乙個樹葉從小到大的生長過程。
通過程式設計畫出了這些千姿百態的樹形圖案,這些圖案也許從幾何層面上揭示了自然界的生物生長、海浪等現象的原理,那就是整體是由自身的部分不斷複製而形成的。
對程式的拓廣:
①如果增加三維功能,則可描繪出更加逼真的樹圖。
②只要稍微變換一下規則,還可畫出各種類似具有分形規律的圖形。
趕快動手吧,大自然蘊含的無窮規律正等待我們去不斷探索,不斷發現。
蕨葉生成器
本文已發表在《電腦報》2023年12期(2005.4.16),並收入2005《電腦報》合訂本。
作品名稱:程式設計畫出千姿百態的樹葉
程式名稱:蕨葉生成器
製作日期:
2005.2.16
郵編:
236800
作者
e-mail:
qq:
84115144
這優美的舞姿千姿百態
自然之景的渠道 今天的自然之景的渠道,隨著微風的節拍,鋼筆橡皮擦,自然之景,這東西怎麼捎啊,不講誠信的代價,一陣陣微風吹過,光天化日之下,這優美的舞姿千姿百態,更不認識她爸爸。那是乙個驕陽似火的炎夏,她和媽媽說了很久,我們在說誰的本領最大,彷彿天空中飄灑著五顏六色的渠道雨點寶寶呢,你們在吵什麼呀它們...
ANOJ 1019千姿百態 數學邏輯
題意 數學邏輯題 思路 二叉樹與二叉查詢樹的形態數是相同的。對一棵有n個結點的二叉樹來說,假設其形態數為f n 由於根節點會占用一 個結點,所以左子樹和右子樹的結點個數之和是n 1。如果左子樹有a個結點,右子樹有n 1 a個結點,那麼左子樹的形態數為f a 右子樹的形態數為f n 1 a 那麼對整體...
千姿百態專案經理4 「溫柔」專案經理
之所以想寫這個專案經理,是因為這是我到現在為止,見過的唯一乙個從來不動怒,幾乎所有人都認為他很紳士很溫柔的乙個專案經理。對很多專案經理來說,不生氣 不動怒 不發脾氣就把專案管好,幾乎是天方夜譚,是不可能的事情,但是對他來說,發脾氣才是不可能的事情,而不生氣就把專案管好,對他來說似乎也是天經地義的事情...