MS Small Basic第八章: Turtle Graphics(海龜繪圖法)

關於海龜繪圖法, 在 MS Small Basic第七章: Fun with Shapes(玩形)(Part3: Turtle Graphics) 的時候已經有預告過, 這次是將學習手冊裡的第八章: Turtle Graphics內容做複習以及強化學過的概念. 電腦字典說海龜繪圖法是: “在許多繪圖系統當中,都使用的一種繪圖方法。想像一隻大海龜在沙灘上爬行,而在沙灘上所留下來的痕跡,這就像是將海龜當成一隻畫筆,而沙灘是一張畫紙的繪圖方法。所以海龜繪圖法簡單的說,便是利用一個繪圖指標 (海龜) 移動的路徑過便繪製出圖形的原理來畫圖,當然這個繪圖指標可以提起或放下,就好像繪圖機 (plotter) 的動作一樣,繪圖語言LOGO便是海龜繪圖法的始祖。" 海龜繪圖法是電腦圖學(Computer Graphics)必學內容, caterpillar大的網誌有很豐富的電腦圖學學習筆記,用LOGO語言撰寫海龜與碎形可參見阿特拉斯的 “Logo小海龜實現碎形繪圖程序" .

炎炎夏日, 先來張海龜的無碼露點清涼照吧

Turtle.Show(): When using operations on the Turtle, it is not necessary to call Show(). The Turtle will be automatically made visible whenever any Turtle operation is performed.

繪製每個邊顏色隨機的正方形:

如果要畫六邊形(hexagon),可以用For i = 1 To 6 (因為六個邊),再使用 Turn() 指定旋轉的角度. 繞完整一圈回來是360度, 有六個邊, 六個外角, 所以每一次旋轉要360/6=60度(這純粹是幾何的知識,跟電腦程式沒關係啊,但是連要轉幾度都不知道,程式再厲害也沒屁用,所以…數學真的很重要,奉勸還在唸國高中的小朋友一定要好好學數學,雖然數學老師可能很機車.)

由以上例子可知, 要畫一個任意(正)多邊形(polygon), 我們需要知道: (1)每次旋轉的角度; (2)邊長. 因此以下練習試著畫一個超多邊(100個邊)的正一百邊形. 海龜的起始座標為(160, 200), 速度10, 有100個邊(變數為sides), 週長為1000, 所以每個邊的邊長(length)就是1000/sides, 繞一圈回來是360度, 所以每次要旋轉的角度(angle)是 360/sides. For迴圈的寫法就改成 For i = 1 To sides (變數sides要先指定), 顏色採隨機(GetRandomColor), 海龜每次移動的長度(也就是邊長)是 Turtle.Move(length), 每次旋轉的角度為 Turtle.Turn(angle), 記得lengthangle這些自己設的變數都要在使用前先定義好:

為什麼要設100個邊? 因為數學基本常識告訴我, 當一個正多邊形的邊數趨近於無限大, 可視為圓形, 也就是畫出來的圖形會非常像圓形, 除非你拿放大鏡把每個邊邊角角放大檢視, 才會發現它是山寨版的圓形. 同樣的概念也可以倒過來說, 一個圓可以被視為一個無限多邊的正多邊形, 圓周長就等於正多邊形的邊長. 除了正多邊形和圓, 只要是曲線都可以像這樣被無限分割, 這是極限微積分的基本概念, 感謝高中數學老師!

利用上面無限多個邊會趨近圓形的概念還有For迴圈,可以畫出更眼花撩亂的圖形. 下面的例子包含兩層For迴圈. 第一層是 For i = 1 To 20 , 表示要畫20個圖形, 重複20次For迴圈裡面的動作, 並且每做完一次動作回來原點後都要往順時鐘方向轉18度, 指令是 Turtle.Turn(18). 第二層迴圈是 For j = 1 To 20 , 用隨機顏色畫正100邊形, 正100邊形的邊長(length)是400/sides, 外角(也就是每一個move之後要旋轉的角度)(angle)是360/sides.

結合PenUp()(筆起)和PenDown()(筆落)的指令還可以畫出虛線多邊形. 先看一個沒有照學習手冊範例, 自以為聰明的失敗例子:

只用了一層For迴圈, 針對每個邊筆起筆落, 畫出來的圖形就變上面那樣. 但失敗為成功之母, 透過試誤學習法(Trial and Error Method), 這次按照學習手冊範例看看會不會成功: 

果然成功了. 需要兩層For迴圈, 第一層For迴圈是針對六邊形的各個邊做設定, 第二層For迴圈是針對每個邊內部做設定, 這邊設定每走 length/12 的長度就 PenUp(), 走 length/12之後再 PenDown(). 我自己又多加了一行隨機顏色的指令, 隨機顏色加在第二層For和第一層For效果應該會不一樣, 我沒實際試過. 第二層的 For j = 1 To 6 能否改成 For j = 1 To sides 也是可以試試看, 因為 sides = 6.

廣告

About leeoxygen

吱吱喳喳,嚕嚕啦啦,嗯嗯啊啊.
本篇發表於 我的Small Basic學習記錄 並標籤為 , 。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s