偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

離譜!產(chǎn)品要求我用 JavaScript 畫一顆【隨機樹】!

開發(fā) 前端
產(chǎn)品要的是一顆隨機樹,也就是樹的茂盛程度、長度、枝干粗細(xì)都是隨機的,那這確實沒辦法叫 UI 給圖,畢竟 UI 不可能給我 10000 張樹的圖片吧?

用 JavaScript 畫一棵樹?

產(chǎn)品說要讓前端用 JavaScript 畫一棵樹出來,但是這難道不能直接讓 UI 給一張圖片嗎?

圖片圖片

后來一問才知道,產(chǎn)品要的是一顆隨機樹,也就是樹的茂盛程度、長度、枝干粗細(xì)都是隨機的,那這確實沒辦法叫 UI 給圖,畢竟 UI 不可能給我 10000 張樹的圖片吧?

Canvas 畫一顆隨機樹

接下來使用 Canvas 去畫這棵隨機樹。

基礎(chǔ)頁面

我們需要在頁面上寫一個 canvas 標(biāo)簽,并設(shè)置好寬高,同時需要獲取它的 Dom 節(jié)點、繪制上下文,以便后續(xù)的繪制。

圖片圖片

坐標(biāo)調(diào)整

默認(rèn)的 Canvas 坐標(biāo)系是這樣的。

圖片圖片

但是我們現(xiàn)在需要從中間去向上去畫一棵樹,所以坐標(biāo)得調(diào)整成這樣:

  • X 軸從最上面移動到最下面。
  • Y 軸的方向由往下調(diào)整成往上,并且從最左邊移動到畫布中間。

圖片圖片

這些操作可以使用 Canvas 的方法:

  • ctx.translate: 坐標(biāo)系移動。
  • ctx.scale: 坐標(biāo)系縮放。

圖片圖片

繪制一棵樹的要素

繪制一棵樹的要素是什么呢?其實就是樹枝和果實,但是其實樹枝才是第一要素,那么樹枝又有哪些要素呢?無非就這幾個點:

  • 起始點
  • 樹枝長度、樹枝粗細(xì)
  • 生長角度
  • 終點

開始繪制

所以我們可以寫一個 drawBranch 來進(jìn)行繪制,并且初始調(diào)用肯定是繪制樹干,樹干的參數(shù)如下:

  • 起始點:(0, 0)
  • 樹枝長度、樹枝粗細(xì):這些可以自己自定義
  • 生長角度:90度
  • 終點:需要算

圖片圖片

這個終點應(yīng)該怎么算呢?其實很簡單,根據(jù)樹枝長度、生長角度就可以算出來了,這是初高中的知識

圖片圖片

于是我們可以使用 Canvas 的繪制方法,去繪制線段,其實樹枝就是一個一個的線段:

圖片圖片

到現(xiàn)在我繪制出了一個樹干出來:

圖片圖片

但是我們是想讓這棵樹開枝散葉,所以需要繼續(xù)遞歸繼續(xù)去繪制更多的樹枝出來。

遞歸繪制

其實往哪開枝散葉呢?無非就是往左或者往右。

圖片圖片

所以需要遞歸畫左邊和右邊的樹枝,并且子樹枝肯定要比父樹枝更短、比父樹枝更細(xì),比如我們可以定義一個比例:

  • 子樹枝是父樹枝長度的 0.8。
  • 子樹枝是父樹枝粗細(xì)的 0.75。

而子樹枝的生長角度,其實可以隨機,我們可以在 0° - 30° 之間隨機選一個角度,于是增加了遞歸調(diào)用的代碼:

圖片圖片

但是這個時候會發(fā)現(xiàn),報錯了,爆棧了,因為我們只遞歸開始,但卻沒有在某個時刻遞歸停止。

圖片圖片

我們可以自己定義一個停止規(guī)則(規(guī)則可以自己定義,這會決定你這棵樹的茂盛程度):

  • 粗細(xì)小于 2 時馬上停止
  • (粗細(xì)小于 10 時 + 隨機數(shù))決定是否停止

圖片

現(xiàn)在可以看到我們已經(jīng)大致繪制出一棵樹了。

圖片圖片

不過還少了樹的果實。

繪制果實

繪制果實很簡單,只需要在繪制樹枝結(jié)束的時候,去把果實繪制出來就行,其實果實就是一個個的白色實心圓:

圖片圖片

至此這棵樹完整繪制完畢。

圖片圖片

繪制部分的代碼如下:

圖片 圖片

責(zé)任編輯:武曉燕 來源: 前端之神
相關(guān)推薦

2021-05-12 19:19:44

字典樹數(shù)據(jù)結(jié)構(gòu)

2017-02-23 10:50:32

Python微博數(shù)據(jù)

2017-02-24 19:32:39

微博數(shù)據(jù)Python

2021-12-24 11:58:20

Shell腳本圣誕樹編程語言

2020-06-30 15:38:17

戴爾

2013-09-29 11:08:10

Bay Trail平板電腦

2009-06-10 18:15:36

電腦下鄉(xiāng)家電下鄉(xiāng)

2022-12-27 14:29:37

javascript動畫

2010-07-30 15:58:18

2022-08-26 12:13:40

黑客網(wǎng)絡(luò)攻擊

2013-04-16 13:57:36

2014-07-30 16:19:13

敏捷華為

2021-03-15 14:17:38

射頻芯片5G手機信號

2021-06-30 13:20:05

Windows 11芯片PC

2009-04-21 18:04:04

雙核Nehalemintel

2021-01-21 21:14:53

人工智能AIOpenAI

2021-08-13 08:19:31

狀態(tài)機設(shè)計模式

2015-05-18 16:12:32

信息化轉(zhuǎn)型油氣行業(yè)華為

2015-01-12 11:07:22

點贊
收藏

51CTO技術(shù)棧公眾號