#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