天天看點

《JavaScript高效圖形程式設計(修訂版)》——6.9 畫布和遞歸繪圖

本節書摘來自異步社群《javascript高效圖形程式設計(修訂版)》一書中的第6章,第6.9節,作者:【美】raffaele cecco著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

立即模式繪圖的好處之一是不需要建立和操作什麼中間資料結構。在立即模式繪圖中,你可以立即忘記剛剛執行的繪圖指令,或者疊加多個繪圖指令。這對在畫布中使用高密度、遞歸的繪圖函數(如不規則碎片形)特别有用。遞歸函數指的是調用自己的函數。通過将函數的上次結果傳回給函數本身,我們建立了軟體的回報環路。下面的例子遞歸調用自己10次:

《JavaScript高效圖形程式設計(修訂版)》——6.9 畫布和遞歸繪圖

這個例子雖然很簡單,但它示範了遞歸函數的兩個重要方面:

在遞歸函數内修改值,然後将這個值回報回去。

我們需要一個條件語句來跳出死循環。

下面我們将嘗試用更有趣的東西,具體說是用一點三角函數和一點随機元素,來代替簡單的遞歸遞減。圖6-14顯示了遞歸調用簡單的畫布畫線指令得出的樹。遞歸圖形函數的一個顯著特點是看起來比較自然,我們可以看到分支的末梢非常精細。這是由于前面提過的分數像素級抗鋸齒技術。

《JavaScript高效圖形程式設計(修訂版)》——6.9 畫布和遞歸繪圖

盡管外觀複雜、細節豐富,實作代碼卻非常簡單:

《JavaScript高效圖形程式設計(修訂版)》——6.9 畫布和遞歸繪圖
《JavaScript高效圖形程式設計(修訂版)》——6.9 畫布和遞歸繪圖

6.9.1 畫布樹的頁面布局

修改drawtree()的初始值,你會發現初始值的微小變化可以給出非常不同的結果。不推薦使用遠超過12的depth值(倒數第二個參數),除非你非常有耐心!

《JavaScript高效圖形程式設計(修訂版)》——6.9 畫布和遞歸繪圖

/這裡是drawtree()函數的代碼/

繼續閱讀