編程模擬自然(六):如何畫(huà)一顆動(dòng)態(tài)樹(shù)
序·亞當(dāng)夏娃篇
《元紀(jì)》上記載,在伊甸園的中央有兩棵樹(shù),一棵為生命樹(shù),一棵為真值樹(shù)。
創(chuàng)世神對(duì)他的子民說(shuō),園子里各樣的果子都可以吃,除了真值樹(shù)上的果子不可吃。
但亞當(dāng)夏娃受了蛇的誘惑,吃了真值果,從此他們兩人知曉了真假,離開(kāi)伊甸園后過(guò)上了幸福快樂(lè)的生活。
(前情提要:創(chuàng)世神元離開(kāi)了,但亞當(dāng)和夏娃還在伊甸園里生活著...)
“這條蛇怎么一動(dòng)不動(dòng)啊?”夏娃小心翼翼地躲在亞當(dāng)身后。
“蛇是冷血?jiǎng)游铮瑔?dòng)比較慢!”亞當(dāng)做著解釋。
.....一刻鐘后,蛇醒了過(guò)來(lái)。
“你是誰(shuí)?為何出現(xiàn)在這里?”亞當(dāng)?shù)恼Z(yǔ)氣有些不滿(mǎn),估摸著這蛇剛才驚嚇到了夏娃。
“哦,你好,我的名字是 VisualSnake,覺(jué)得長(zhǎng)可以簡(jiǎn)稱(chēng) VS。”
“這么奇怪的名字。”
“這是創(chuàng)世神起的,我可是他手底下最得意的 IDE。”
“想起來(lái)了,我在前年見(jiàn)過(guò)你。”夏娃想起了什么。
“哦?那不是我,蛇每年都要蛻皮換代的!”VS 回答。
蛇思索了下,繼續(xù)說(shuō)
“...我想你見(jiàn)到的應(yīng)該是 VS2013。”

圖6-1 創(chuàng)世神的警告
第零章 如何成為一名優(yōu)秀的程序猿
“為什么警告有 256 條?”夏娃有些疑惑。
“多于 256 條就會(huì)引發(fā) SnakeOverflow,我是不會(huì)吃飽了撐著的。”VS 想攤一下雙手的,意識(shí)到自己沒(méi)有手只好搖一搖尾巴。
優(yōu)秀的條件
“既然警告這么多次,那我們就不吃了。“
“別啊,一名合格的程序猿從來(lái)都是無(wú)視警告,他只關(guān)心錯(cuò)誤!“
“啊?“
“開(kāi)玩笑的,優(yōu)秀是由好的習(xí)慣、辛勤勞動(dòng)、驚人毅力...共同促成。”
“那我們要怎么做呢?”亞當(dāng)問(wèn)了關(guān)鍵的一句。
“你們將在我的幫助下完成一個(gè)項(xiàng)目,只有實(shí)踐才能真正出真知...”
“同時(shí)在這過(guò)程中我將教會(huì)你們優(yōu)秀程序猿進(jìn)行程序開(kāi)發(fā)的必備準(zhǔn)則。”
“所以一款優(yōu)秀的 IDE 也是很重要的,比如我...”VS 絮絮叨叨個(gè)沒(méi)完。
第一章 原則
“無(wú)論一條原則是如何地正確,都只能在特定場(chǎng)合發(fā)揮作用。”
Hello World
“你們要做的程序是創(chuàng)世神留下來(lái)的靜態(tài)樹(shù),現(xiàn)在需要你們進(jìn)一步完善它。”
“首先給你們的項(xiàng)目起個(gè)名稱(chēng),要求不能是 aa, test, MyFirstProject ...”
“不如叫 HelloWorld 吧。”亞當(dāng)突然冒出一句。
“小伙子,你很有天賦啊!”

圖6-2 創(chuàng)世神的水墨靜態(tài)樹(shù)
“這是一顆靜態(tài)樹(shù),現(xiàn)在你們要設(shè)計(jì)算法讓它可以生長(zhǎng)。”
第二章 從簡(jiǎn)單開(kāi)始
“無(wú)論是學(xué)習(xí)過(guò)程還是程序開(kāi)發(fā),從簡(jiǎn)單開(kāi)始。”
給每個(gè)樹(shù)干設(shè)定一個(gè)成長(zhǎng)系數(shù),樹(shù)干的長(zhǎng)度和寬度都和這個(gè)系數(shù)相關(guān)。

圖6-3 動(dòng)態(tài)樹(shù)-生長(zhǎng)
----
“逐步求精方法就如同這樹(shù)木成長(zhǎng),由簡(jiǎn)到繁,符合大自然的規(guī)律,哈哈...”VS 似乎很喜歡這種淳淳教誨的感覺(jué)。
第三章 避免重復(fù)錯(cuò)誤
“夏娃小姐,你有一條錯(cuò)誤。”
“什么?錯(cuò)誤?沒(méi)有啊”
“是的,你有一條錯(cuò)誤信息”
“是出你錯(cuò)了,不是我錯(cuò)了”
“……“
----
每個(gè)枝干旋轉(zhuǎn)一定角度(節(jié)點(diǎn)的旋轉(zhuǎn)角度是其父節(jié)點(diǎn)的 1.618 倍)

圖6-3 動(dòng)態(tài)樹(shù)-晃動(dòng)
但是這樣的搖動(dòng)有些生硬,看起來(lái)就像每個(gè)樹(shù)枝對(duì)風(fēng)的受力都是一樣的。
好的方法是,假設(shè)風(fēng)向水平,那么越垂直的樹(shù)枝需要抖動(dòng)的越厲害。(將樹(shù)枝旋轉(zhuǎn)的角度乘以方向與風(fēng)向的夾角正弦值即可)

圖6-4 動(dòng)態(tài)樹(shù)-晃動(dòng)優(yōu)化
----
“前進(jìn)道路中的錯(cuò)誤時(shí)不可預(yù)料的,走錯(cuò)了方向就要及時(shí)糾正,錯(cuò)誤同正確一樣都是寶貴的經(jīng)驗(yàn)!”
“那警告呢?”夏娃對(duì)剛才 VS 報(bào)錯(cuò)有些耿耿于懷。
“......警告也要盡量避免,畢竟事物很難完美。”VS 越教越自信了。
第四章 善用奏效的方法
“總結(jié)過(guò)去是為了更好的未來(lái)。”
開(kāi)出花朵,葉子凋零。

圖6-5 動(dòng)態(tài)樹(shù)-落葉
----
“掌握了簡(jiǎn)單的方法,以后就可以應(yīng)用到復(fù)雜的問(wèn)題中去,這也是為什么前面要說(shuō)的從簡(jiǎn)單開(kāi)始。”
“那大道至簡(jiǎn)怎么解釋?zhuān)俊币恢蹦瑢?xiě)代碼的亞當(dāng)終于說(shuō)話(huà)了。
“一個(gè)完美的公式、統(tǒng)一的定理,雖然在在形式上是簡(jiǎn)單的,但它的內(nèi)涵卻是復(fù)雜的。”VS 感覺(jué)自己化身一位老學(xué)究,沒(méi)有人能夠質(zhì)疑他的話(huà)。
第五章 摒棄固執(zhí)己見(jiàn)
“新舊事物都有好有壞,遠(yuǎn)離偏見(jiàn),沒(méi)有最好只有最適合的。”
樹(shù)枝用貼圖畫(huà)效果會(huì)好看很多。

圖6-6 樹(shù)枝貼圖/畫(huà)線(xiàn)

圖6-7 直線(xiàn)樹(shù)枝

圖6-8 貼圖樹(shù)枝
----
“你為什么要教授我們這些?”
“創(chuàng)世神離開(kāi)伊甸園的時(shí)候,就推出了 VS 的‘伊甸社區(qū)版’,對(duì)你們個(gè)人是免費(fèi)的。”
“再說(shuō)了,難道你們就想一直待在這里?”VS 吐了下蛇信子,反問(wèn)道。
后記
很多很多年后。
“神父,圣母夏娃和亞當(dāng)初為什么選擇離開(kāi)伊甸園?”
“他們要去找尋創(chuàng)世神的足跡!”
“父親,夏娃和亞當(dāng)前輩初為什么選擇離開(kāi)伊甸園啊?”
“他們不想兩人的愛(ài)情結(jié)晶被困在一個(gè)地方!”
.......
“夏娃,......”
“世界那么大,我們出發(fā)吧!”
浙公網(wǎng)安備 33010602011771號(hào)