成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

離譜!產品要求我用 JavaScript 畫一顆【隨機樹】!

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

用 JavaScript 畫一棵樹?

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

圖片圖片

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

Canvas 畫一顆隨機樹

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

基礎頁面

我們需要在頁面上寫一個 canvas 標簽,并設置好寬高,同時需要獲取它的 Dom 節點、繪制上下文,以便后續的繪制。

圖片圖片

坐標調整

默認的 Canvas 坐標系是這樣的。

圖片圖片

但是我們現在需要從中間去向上去畫一棵樹,所以坐標得調整成這樣:

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

圖片圖片

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

  • ctx.translate: 坐標系移動。
  • ctx.scale: 坐標系縮放。

圖片圖片

繪制一棵樹的要素

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

  • 起始點
  • 樹枝長度、樹枝粗細
  • 生長角度
  • 終點

開始繪制

所以我們可以寫一個 drawBranch 來進行繪制,并且初始調用肯定是繪制樹干,樹干的參數如下:

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

圖片圖片

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

圖片圖片

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

圖片圖片

到現在我繪制出了一個樹干出來:

圖片圖片

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

遞歸繪制

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

圖片圖片

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

  • 子樹枝是父樹枝長度的 0.8。
  • 子樹枝是父樹枝粗細的 0.75。

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

圖片圖片

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

圖片圖片

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

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

圖片

現在可以看到我們已經大致繪制出一棵樹了。

圖片圖片

不過還少了樹的果實。

繪制果實

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

圖片圖片

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

圖片圖片

繪制部分的代碼如下:

圖片 圖片

責任編輯:武曉燕 來源: 前端之神
相關推薦

2021-05-12 19:19:44

字典樹數據結構

2017-02-23 10:50:32

Python微博數據

2017-02-24 19:32:39

微博數據Python

2021-12-24 11:58:20

Shell腳本圣誕樹編程語言

2020-06-30 15:38:17

戴爾

2013-09-29 11:08:10

Bay Trail平板電腦

2022-12-27 14:29:37

javascript動畫

2009-06-10 18:15:36

電腦下鄉家電下鄉

2010-07-30 15:58:18

2022-08-26 12:13:40

黑客網絡攻擊

2014-07-30 16:19:13

敏捷華為

2013-04-16 13:57:36

2021-03-15 14:17:38

射頻芯片5G手機信號

2021-06-30 13:20:05

Windows 11芯片PC

2009-04-21 18:04:04

雙核Nehalemintel

2015-01-12 11:07:22

2015-05-18 16:12:32

信息化轉型油氣行業華為

2021-08-13 08:19:31

狀態機設計模式

2021-01-21 21:14:53

人工智能AIOpenAI

2022-11-01 12:30:11

機器學習解碼系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: v片网站 | 成人一区在线观看 | 成人在线视频免费观看 | 免费在线观看一区二区三区 | 国产精品免费视频一区 | 中文字幕精品视频 | 欧美日韩高清免费 | 欧美性区 | 日韩高清成人 | 男人的天堂久久 | 欧美日韩精品中文字幕 | 视频精品一区二区三区 | 成人精品国产 | 成人在线视频免费播放 | 国产一级电影网 | 成人av一区| 欧洲一级黄 | 国产精品欧美日韩 | 天天看逼 | 精品一区二区电影 | 在线观看的av | 欧美日韩电影一区 | 欧美一级黄色片 | 午夜爽爽爽男女免费观看影院 | 久久国产日本 | 91精品国产91久久综合桃花 | 国产精品久久久久久中文字 | 国产高清精品一区二区三区 | 亚洲先锋影音 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲欧美精 | 成人在线欧美 | 欧美黄色精品 | 国产精品国产自产拍高清 | 成人网在线看 | 国产成人高清 | 国产精品自拍啪啪 | www.国产视频 | 亚洲夜射 | 国内成人免费视频 | 暖暖日本在线视频 |