程式設計畫出千姿百態的樹葉

2021-04-02 17:58:18 字數 2500 閱讀 4470

程式設計畫出千姿百態的樹葉

[email protected]

走到戶外,欣賞大自然的美景,映入眼簾的是千姿百態,各種各樣美麗的樹。這不禁使人在心曠神怡之餘開始讚嘆大自然的偉大。於是就有了用電腦把這美景畫出來的衝動。

經過一番探索,程式編出來了,畫出的效果還真不少,如圖

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:

[email protected]

qq:

84115144

這優美的舞姿千姿百態

自然之景的渠道 今天的自然之景的渠道,隨著微風的節拍,鋼筆橡皮擦,自然之景,這東西怎麼捎啊,不講誠信的代價,一陣陣微風吹過,光天化日之下,這優美的舞姿千姿百態,更不認識她爸爸。那是乙個驕陽似火的炎夏,她和媽媽說了很久,我們在說誰的本領最大,彷彿天空中飄灑著五顏六色的渠道雨點寶寶呢,你們在吵什麼呀它們...

ANOJ 1019千姿百態 數學邏輯

題意 數學邏輯題 思路 二叉樹與二叉查詢樹的形態數是相同的。對一棵有n個結點的二叉樹來說,假設其形態數為f n 由於根節點會占用一 個結點,所以左子樹和右子樹的結點個數之和是n 1。如果左子樹有a個結點,右子樹有n 1 a個結點,那麼左子樹的形態數為f a 右子樹的形態數為f n 1 a 那麼對整體...

千姿百態專案經理4 「溫柔」專案經理

之所以想寫這個專案經理,是因為這是我到現在為止,見過的唯一乙個從來不動怒,幾乎所有人都認為他很紳士很溫柔的乙個專案經理。對很多專案經理來說,不生氣 不動怒 不發脾氣就把專案管好,幾乎是天方夜譚,是不可能的事情,但是對他來說,發脾氣才是不可能的事情,而不生氣就把專案管好,對他來說似乎也是天經地義的事情...