| #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 |