天天看點

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

程式設計畫出千姿百态的樹葉 作者:安徽省亳州三中教科處王宇    郵編:236800      E-Mail: [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 所示:
程式設計畫出千姿百态的樹葉
  在程式運作時可以友善的調節各個參數,通過調整比例系數可以改變子樹的大小,進而決定畫出的形狀更像是樹之還是樹葉;調整子樹的傾斜角度可以形成不同的樹種;在各個參數中曲度對樹的形狀影響最大,調整它可以生成不同類别的圖案。使用動畫按鈕還可觀察到一個樹葉從小到大的生長過程。   通過程式設計畫出了這些千姿百态的樹形圖案,這些圖案也許從幾何層面上揭示了自然界的生物生長、海浪等現象的原理,那就是整體是由自身的部分不斷複制而形成的。   對程式的拓廣:   ① 如果增加三維功能,則可描繪出更加逼真的樹圖。   ② 隻要稍微變換一下規則,還可畫出各種類似具有分形規律的圖形。   趕快動手吧,大自然蘊含的無窮規律正等待我們去不斷探索,不斷發現。  

程式下載下傳頁面: 蕨葉生成器

本文已發表在《電腦報》2005年12期(2005.4.16),并收入2005《電腦報》合訂本。   作品名稱:程式設計畫出千姿百态的樹葉 程式名稱:蕨葉生成器 制作日期: 2005.2.16 郵編: 236800 作者 E-Mail: [email protected]   QQ : 84115144

繼續閱讀