程式設計畫出千姿百态的樹葉 作者:安徽省亳州三中教科處王宇 郵編:236800 E-Mail: [email protected] | |
走到戶外,欣賞大自然的美景,映入眼簾的是千姿百态,各種各樣美麗的樹。這不禁使人在心曠神怡之餘開始贊歎大自然的偉大。于是就有了用電腦把這美景畫出來的沖動。 經過一番探索,程式編出來了,畫出的效果還真不少,如圖 1 所示,筆者根據其形狀命名的有蕨葉、蘆葦、葉脈、文竹、大樹、嫩藤、小草、葡萄、迎客松、玫瑰花、五星花、蒲公英、塔、羽毛、鳳凰、孔雀、浪花、稻草人等。 ![]() | |
① 首先從起點開始向前走到第一個分叉點,設距離是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 所示: | |
程式下載下傳頁面: 蕨葉生成器 本文已發表在《電腦報》2005年12期(2005.4.16),并收入2005《電腦報》合訂本。 作品名稱:程式設計畫出千姿百态的樹葉 程式名稱:蕨葉生成器 制作日期: 2005.2.16 郵編: 236800 作者 E-Mail: [email protected] QQ : 84115144 |