#E6E6E6 【VB 物件】Logo 小海龜實現碎形繪圖程序 作者:吳文成

  在我去年編寫的碎形教材(被歸於複雜性科學的領域),介紹了繪[[img src=computer/logo_hilbert.gif height=179 width=170 align=right]]製碎形的主要幾種方法,無論是哪一種方法都牽涉到疊代(iteration)、遞迴(遞歸,recursion)的概念,這些概念的重要性貫穿了整個計算機科[[img src=computer/logo_dragons.gif height=199 width=186 align=left]]學
、數理邏輯與近來興起的複雜性科學,也是 Logo 小海龜之所以繪圖功力了得的主要關鍵。我曾在碎形教材裡 (L-System)提到過這隻小海龜,牠在美國的兒童教育界引領了一股海龜製圖法( Turtle Graphics ) 與海龜幾何學(Turtle Geometry)的風潮 。 牠到底有多嗆、多厲害,先來看看這些圖例吧。這[[img src=computer/logo_fern.gif height=219 width=186 align=right]]些圖都是經驗老到的小海龜所畫的,每張圖小海龜都花不到十五行的 Logo 程式碼就完成了
等一下我再來談談 ,什麼是 Logo 電腦程式語言)
。我們以外觀看起來最困難的蕨葉為例,它的 Logo 程式碼如下, 紅色字體的部分就是運用到遞迴方法的程序,而分號開始的文字
灰色字體)
便是註解:

to main         ; 主程序
 draw 305
end
             ; 定義子程序
to draw :size      ; 也是遞迴程序
 IF :size<5 [Stop]   ; 條件判斷後,結束
 FD :size/25      ; FD 是前進
 LT 80 draw :size*.3  ; LT 是左轉
 RT 82 FD  :size/25  ; RT 是右轉
 RT 80 draw :size*.3  ; RT 80 之後,遞迴自己
 LT 78 draw :size*.9  ; LT 78 之後,遞迴自己
 LT 2 BK  :size/25  ; BK 是後退
 LT 2 BK  :size/25  ; LT 2 之後,BK 長度(size/25)
end


  這裡的程式碼指令只用到條件判斷(IF)與前進( Forward,簡寫 FD
、後退(Backward,簡寫 BK)、左轉(Left,簡寫 LT)與右轉( Right
,簡寫 RT)
。 我們可以想像有一隻小海龜在螢幕上 ,按照遞迴的程序而一下前進、後退,一下轉轉身子,直到完成一幅蕨葉。這裡的遞迴程序就是被不斷呼叫的子程序 draw( 它的輸入引數是 :size,Logo 語言的變數前面都有冒號作為識別 ), draw 負責畫出不同大小的支葉, 同時小海龜也移動位置與角度,這使得整枝蕨葉呈現生動的弧度與絕妙的收尾。學習過碎形的網友一定知道這是樹狀碎形的一種,遞迴程序使得它在不同尺度上「自我相似」(是否注意到每一支葉其實都是全體的縮小版?是的,遞迴的意義就在於此,即反覆地疊代自身,然後再以不同的角度、方位與大小加入整體之中。上面另外兩張頗具知名度的碎形圖 Hilbert Curve 與 Dragon Curve 也是這樣。大自然的幾何形塑更是非線性動力系統的遞迴結果

  這套程式碼是應用了 Logo 電腦程式語言 , 但是 Logo 語言有許多版本,包括 UCB Logo、Star Logo 與 Gerlabau Logo(國內是由劉敬洲先生在 1997 年開發為「 葛拉堡中文小海龜 」,目前作為許多中小學的推廣課程
,我在這裡所用的是 Microsoft Windows Logo(MSW Logo)。為什麼它會與小海龜結下不解之緣呢? 這是因為 Logo 的前身在五O年代是一個像小海龜的機械裝置 ,到了六O年代,麻省理工學院設計了一套 Logo 編碼程序,可以讓小朋友輸入指令,讓這隻小海龜在地板上前進轉彎,後來個人電腦普及,小海龜也從地板「遷居」到了電腦螢幕上。專為兒童教育與激發兒童創造力, 所設計的 Logo 語言也因此在美國日益普遍,直到今日
,它仍然是建構式教育理念的重要教學工具。(我會另外找個時間編寫教材,介紹 Logo 語言、碎形幾何學與建構主義的教育哲學,等有關主題)

  Logo 程式語言相當簡單易學 , 它的直譯器使得程式除錯與撰寫更具有互動性 ,如果你只鍵入 FD 而沒有補上長度,它會馬上告訴你:小海龜不知道要前進多少距離!海龜製圖法的關鍵在於海龜的移動,我們最常用的指令集中在前進、後退、左轉、右轉,與下筆(PenDown,海龜移動留痕跡,簡寫 PD)與提筆(PenUp,海龜移動不留痕跡,簡寫 PU), 定位(SetPos)與定角(SetHead,把ㄣ頭擺到指定的角度)、迴圈(Reapeat、While 或 For)與條件指令(IF)等等。例如想畫正方形,只要依序輸入以
[[img src=computer/logo1.gif height=135 width=105 align=left]]下的指令:

FD 100 RT 90   ; 前進 100 單位,右轉 90 度
FD 100 RT 90
FD 100 RT 90
FD 100 RT 90   ; 最後一行,小海龜回到原位置與原角度

這些程式碼即可。有沒有注意到某些指令的組合重複了四次?如果利用迴圈指令,我們可以把畫正方形的程式碼簡要地改寫成:

Repeat 4 [FD 100 RT 90]

或者是

For [i 1 4] [FD 100 RT 90]

(如果還是不瞭解,請參考葛拉堡中文小海龜的教學課程,或者是 MSW Logo 的介紹網頁 http://www.southwest.com.au/~jfuller/logotut/menu.htm

(接下文)
2004/11/18