科赫傳說!!

KochSnowflakeDiff

MetatronKoch2

antisnowflake

Koch Antisnowflake-construction

在那遙遠的銀河裡,有一個科赫王國。那裡的初始之王是一位大智慧者,許下宏願建造永不退轉之國︰本國之土逐年增長,本國之人亦逐年增長,以至無量之無窮無有盡期。不知如此過了幾千千萬萬年,每代之王都謹尊聖諭,於冬至日祭、夏至日祀天上的『雪花之神』, 如是傳到了科赫國王。這個新王想知道聖諭它是真是假?欲明白雪花之神是有是無?於是招集舉國聰明之人有智之士商議調查之法。此舉震驚了全國,大部分的國民 都嚇壞了,說︰這是對神的大不敬;毀壞歷代立下的規矩;不尊重先王的傳統。科赫國王無奈之餘只能禪讓以息民怨,自己踏上了求解之路!他想我要怎麼才能知道 『國土逐年增長』是個事實的呢?於是他首先拜訪了精通『土地丈量』 的人,那丈量人告訴他︰我家無數代以來從事丈量,就我所知的確土地逐年增長。科赫問︰那能知道新增與舊有的差異嗎?丈量人答︰人人舊有的都沒有差異,新土 在之間發生。一番對談後科赫雖心中覺得這事奇怪,但是也無法再多知道些什麼,於是再度踏上旅程。一路上餐風露宿,心理奇怪著為何幼時認得的老人他家還沒到 呢?終於抵達了那稽古老人之住處。問訊之下,老人家身康體泰甚是健談。他聽那老人家抱怨道︰行走都不方便啦!子孫所居山頭相距一代比一代更遠,怕是再過數年想見都見不著啦!!科赫心頭一震,詳細詢知了老人家的子孫何代幾時是相距多少路程,然後辭別進入山裡沉思不知所蹤。原來科赫自幼喜歡數學,但不知他自己 『身在』雪花中,能否發現『答案』就是『雪花』的呢?知道那個王國要是再經歷無窮世代後,也許會變成『行不得』之國??

後來傳聞科赫國王花了數十年抵達『初始之王』的墓陵,進入墳中關掉了那台年復一年『擴張一步』的『國土製造圖靈機』,並且又再度稱王。這樣想來,或許科赫國王終究找到了『答案』;然而另一個『反科赫王國』大概情況不妙,也許最終凶多吉少,不知是否會有個睿智之王起身自救的嗎??

Adrian Toncean 先生在 GitHub 上發表了一個用 javascript 寫的『lindenmayer-power』的 L 系統,其中使用小海龜繪圖法。於此我們將簡單介紹這個軟體的使用方法︰

程式由『文法輸入』Grammar input 和『命令輸入』Commands input 兩個部份組成。文法輸入使用『脈絡無關之隨機的文法』stocastic context-free grammars,按造所給的例子︰

-> Start
0.2 Number
0.4 Start + Start
0.3 Start – Start
0.1 ( Start )
-> Number
0.1 0
0.1 1
0.1 2
0.7 3

改寫規則── 『非終端』nonterminal 字詞符號 ── 是用『->規則名稱』起始定義,比如這裡的『Start』,接著是『【機率大小】 【使用之改寫規則名稱或字詞符號】』,指定將被『使用之改寫規則』的機率數值,軟體會自動作『歸一化』,所以你只需管機率大小數值就好,不必理會是不是所有被定義的 規則加總起來是『1』。比方例子中,『Start』改寫規則有︰

20% 的機會使用『Number』改寫規則
40% 的機會改寫成『【Start 】【+ 】【Start 】』,此處【Start 】就是『Start』改寫規則,而『+』是叫做『終端』 terminal 任意字詞符號,也就是說它不是一個改寫規則 。

如 此依次定義改寫規則完成整個文法輸入。當按 Generate 鍵時,軟體將依據此『文法輸入』以及指定『層次』level 產生整個改寫字串。這個過程中每個非終端符號必被改寫,看起來可能像 Start \rightarrow Start + Start \rightarrow Number + ( Start ) \rightarrow  3 + ( Start - Start )  \dots

洛書

Turtle

L3

L2

images

子虛先生說︰昔時洛水有神龜,總於晨昏之時,彩雲滿天之際,游於洛水之波光霞影之中。興起就神足直行,左旋右轉飛舞迴旋,那時波濤不起漣漪不見,河面只隨神龜尾上下,或粗或細或長或短或直或曲契刻成圖文。一日大禹治水偶經洛水恰遇神龜,神龜感念大禹昔日洩洪疏河之恩,特演平日最得意水畫之作,所以歷史才傳說『大禹得洛書』。

雖然作者以為子虛先生所說乃是烏有之言,然而他卻把『小海龜』繪圖法的精神描寫的活靈活現。小海龜頭的朝向決定它『前進』的方向,『【向前】【數值】 』表示向前走多少單位距離的指令,比方 forward 10,是說向前走十個單位。除了直行之外小海龜還可以『轉向』,這個轉向是依據當前之前進的方向『左轉』或是『右轉』,用『【旋轉】【角度】』表示,比方 rotate 90 是說右轉九十度, 而 rotate -90 是講左轉九十度。小海龜在網頁上的『位置』是由網頁上的 (X,Y) 座標來決定的,它的設定是『左上』(0,0)和『右下』 (600,600) 。小海龜當下的『狀態』state 是由『現在』的『位置』與『朝向角度』所一起決定的,這也就是『存上堆疊』push 與『堆疊取回』pop 存上取回指令裡所說的狀態。小海龜可以給定一個『開始』的『位置』與『朝向』,初進網頁時它在 (50,300),小海龜的頭朝右,它的角度是 0。

比方說下面的例子畫出一個正三角形︰

【文法輸入】︰
-> T
1 F – F – F

文法輸入後按 Read 鍵讀取。然後設定 levels 為 1 ,按 Generate 鍵產生文法的【輸出 Output】︰

T
F – F – F

每一個『終端符號』都給與一個『小海龜程式』,以『【:】【空白】【終端符號】』為定義起始,是說遇見這個終端符號時,將會執行程式裡的哪些小海龜命令。

【命令輸入】︰
:  F
forward 100
:  –
rotate -120

命令輸入後,按 Draw 鍵開始繪圖。請參考 Adrian Toncean 先生的網頁說明以及更多的程式範例。假使還不知道『改寫系統』是什麼的讀者,建議先閱讀『Thue 之改寫系統系列』。

 

在〈科赫傳說!!〉中有 1 則留言

留言功能已關閉。