| #E6E6E6 | 【VB 物件】Logo 小海龜實現碎形繪圖程序 | 作者:吳文成 (接上文) 剛剛提到了繪製正方形的程式碼,我們就將它稱做子程序 square,寫成以下的格式。這種寫法方便我們只要用 square 就可以代替整個程序: [[img src=computer/logo2.gif height=497 width=154 align=left]] to square Repeat 4 [FD 100 RT 90] end 精采的部分要來了,如果我們鍵入指令 Repeat 36 [RT 10 square] , 意思是〔右轉 10,然後畫正方形〕括弧內重複 36 次 , 那麼這個遞迴圖形就是像左上圖那樣 。 現在我們將子程序 square 加上引數 :size 與 :angle,然後變成以下的寫法: to square :size :angle ; 有引數的子程序 IF :size > 100 [Stop] FD :size ; 前進 :size 長度 RT :angle ; 右轉 :angle 角度 square :size + 2 :angle ; 遞迴自己 end ; 同時引數改變 針對有引數的子程序 square,我們只要鍵入簡單的指令 square 0 91,意思是子程序從大小 0 與角度 91 開始自我遞迴 ,小海龜就會畫出中間這個螺旋圖形。如果鍵入指令 square 0 93,小海龜就會畫出左邊這個漩渦圖形。這些圖形都是碎形的簡單例子,所謂碎形是指在結構與尺度上自我相似或自我相仿的圖案,而這些特徵就是某些規則(例如上述[[img src=computer/logo3.gif height=249 width=202 align=right]]的子程序 square)的自我遞迴(疊代)的結果。看起來是簡單的規則,只需要些許的變形,即蘊涵了無限的潛力與複雜性 , Logo 小海龜正帶領我們進入這豐富景象的奧秘之中,那裡有段發揮創造力的旅程。海龜製圖法可以訓練小朋友一個步驟一個步驟地,觀察幾何圖形的片段如何組合成一個富有趣味的整體,也可以訓練像我這樣的老手,如何把複雜的整體拆解成類似單元的疊代結果,並且寫出它的結構方程式(就像是一位物理學家看到自然界雪花的六角結構,便推測得出它的內部非線性動力關係)。 [[img src=computer/logo4.gif height=219 width=250 align=right]] 右邊圖案是一棵典型的碎形樹: to tree :order :len IfElse :order = 1 [ ; 當 FD :len LT 30 FD :len BK :len RT 30 RT 30 FD :len BK :len LT 30 BK :len Stop ] [ ; 否則 FD :len LT 30 tree :order-1 :len*.75 RT 30 RT 45 tree :order-1 :len*.75 LT 45 BK :len ] end 以上是子程序 tree 的 MSW Logo 程式碼,當我們執行指令 tree 9 50 時 ,便會畫出碎形樹( 二元樹 )的圖案。這已經相當接近 Visual Basic 的語法架構了,我們可以進一步改編成 Visual Basic 的子函數型態如下: Private Sub 枯樹(ByVal 層次 As Single, ByVal 長度 As Single) If 層次 = 1 Then ' 當 前進 長度 左轉 30: 前進 長度: 後退 長度: 右轉 30 右轉 30: 前進 長度: 後退 長度: 左轉 30 後退 長度 Else ' 否則 前進 長度 左轉 30: 枯樹 層次 - 1, 長度 * 0.75: 右轉 30 右轉 45: 枯樹 層次 - 1, 長度 * 0.75: 左轉 45 後退 長度 End If End Sub 顯然這麼一改, 我們就知道該如何用 Visual Basic 來「翻譯」Logo 語言程式碼了,基本上可以完全的轉譯。我們必須處理的工作是撰寫 VB 版的 Logo 程式庫 , 即建立 ActiveX DLL 以物件型態呈現可重複使用的程式碼(當然你也可以寫成物件類別),這個程式庫 Logo.dll 至少要定義程式碼(函數)如:定位、定角、前進、後退、左轉、右轉。程式庫必須要有私有變數紀錄目前的小海龜位置與朝向角度,在處理左右轉的時候,需要使用到解析幾何的二維旋轉變換。如果不以矩陣形式表示,則函數如下: Private Const pii = pi / 180 ' 圓週率 π/180 ' 二維旋轉變換,對任意點 (Xo, Yo) 順時鐘旋轉 Angle 度 Private Sub Rotating2D(X, Y, ByVal Xo As Single, ByVal Yo As Single, ByVal Angle As Single) Dim Xe As Single, Ye As Single X = X - Xo: Y = Y - Yo Xe = X: Ye = Y Angle = Angle * pii X = Xe * Cos(Angle) + Ye * Sin(Angle) Y = -Xe * Sin(Angle) + Ye * Cos(Angle) X = X + Xo: Y = Y + Yo ' 傳址回 X, Y End Sub 撰寫這樣的程式庫並不困難,不到六十行的程式碼,我們就可以完成 VB 版的 Logo 語言繪圖環境 。 然而這裡困難的是, 有了這樣簡易而富有彈性的開發環境,我們要如何發揮創意來使小海龜以簡馭繁、不負眾望地發揮潛能?這需要你來動動腦筋。如果你想直接學習與使用 MSW Logo,請從這個網址下載:http://www.softronix.com/logo.html。我將由我所撰寫的 VB 版 Logo 程式庫 Logo.dll 與其源碼,列舉在文末。 |
2004/11/18 |