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

HTML 5 Canvas 遞歸畫樹

開發 前端
上圖就是用html5隨機生成的大樹 : ) 但是你應該沒想到40+行代碼就可以搞定了吧~接下來就跟大家說說這棵大樹是如何實現的。同樣必須要有html容器。新建Index.html,代碼如下.....

QQ20120923 4QQ20120923 5

上圖就是用html5隨機生成的大樹 : ) 但是你應該沒想到40+行代碼就可以搞定了吧~接下來就跟大家說說這棵大樹是如何實現的。

同樣必須要有html容器。新建Index.html,代碼如下:

  1. <html> 
  2. <head> 
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
  4. <title>canvas tree</title> 
  5. </head> 
  6. <body> 
  7. <script type="text/javascript" src="tree.js"></script> 
  8. </body> 
  9. </html> 

接下來咱們開始tree.js:

  1. var canvas = document.createElement("canvas");  
  2. var ctx = canvas.getContext("2d");  
  3. canvas.width = 640;  
  4. canvas.height = 480;  
  5. document.body.appendChild(canvas); 

代碼很好理解,創建一個canvas畫布,然后選擇為2d畫布,設置長寬,***將這個畫布添加到body標簽下。

這個腳本最重要的函數在下面,大樹就是遞歸調用這個函數實現的,調用一次畫一條線段:

  1. var drawTree = function (ctx, startX, startY, length, angle, depth, branchWidth){  
  2. var rand = Math.random,  
  3. newLength, newAngle, newDepth, maxBranch = 3,  
  4. endX, endY, maxAngle = 2 * Math.PI / 4,  
  5. subBraches;  
  6. ctx.beginPath();  
  7. ctx.moveTo(startX, startY);  
  8. endX = startX + length * Math.cos(angle);  
  9. endY = startY + length * Math.sin(angle);  
  10. ctx.lineCap = 'round';  
  11. ctx.lineWidth = branchWidth;  
  12. ctx.lineTo(endX, endY);  
  13. if (depth <= 2){  
  14. ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) >> 0) + ',0)';  
  15. } else {  
  16. ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) >> 0) + ',50,25)';  
  17. }  
  18. ctx.stroke();  
  19. newDepth = depth - 1;  
  20. if (!newDepth)  
  21. return;  
  22. subBranches = (rand() * (maxBranch - 1)) + 1;  
  23. branchWidth *= 0.7;  
  24. for (var i = 0; i < subBranches; i++){  
  25. newAngle = angle + rand() * maxAngle - maxAngle * 0.5;  
  26. newLength = length * (0.7 + rand() * 0.3);  
  27. drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);  
  28. }  

接下來一點點解釋:

首先,解釋下各個變量的含義。ctx就是前面我們的2d畫布;startX是線段開始的橫坐標,同理startY是縱坐標;length是線段長度;angle是角度;depth是深度,葉子深度為1,樹干為12(可自己設定);branchWidth就線段的粗細。有了這些信息,其實就描述了一個線段,通過這些信息我們才能畫一個線段。

接下來又很可恥地一大段定義:

  1. var rand = Math.random,  
  2. newLength, newAngle, newDepth, maxBranch = 3,  
  3. endX, endY, maxAngle = 2 * Math.PI / 4,  
  4. subBraches; 

rand其實就是隨機一個0~1之間的實數,顧名思義,接下來這些new的就是下一節線段的各種參數。maxBranch就是最多有3個分叉,***的角度 PI/2 即為,下一級調整角度在90%范圍內。subBranches就是分叉的個數。

好了,重要可以畫了:

  1. ctx.beginPath();  
  2. ctx.moveTo(startX, startY);  
  3. endX = startX + length * Math.cos(angle);  
  4. endY = startY + length * Math.sin(angle);  
  5. ctx.lineCap = 'round';  
  6. ctx.lineWidth = branchWidth;  
  7. ctx.lineTo(endX, endY); 

beginPath()表示告訴瀏覽器“我要開始畫了!”,把之前的記錄放棄了,這點有點像ps。moveTo()把光標移動到(startX, startY),再計算終點坐標,endX,endY,有點像高中學的參數方程。然后告訴瀏覽器,lineCap要round,線段的兩頭要是圓形的。有多粗呢?等于branchWidth。線段一直畫到(endX, endY)。

  1. if (depth <= 2){  
  2. ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) >> 0) + ',0)';  
  3. } else {  
  4. ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) >> 0) + ',50,25)';  

如果是已經畫到了***兩級,即為葉子,那么就rgb就為(0, 128~192, 0)(rgb代表顏色,分別為紅綠藍,red green blue)。還沒的話,就在(64~128, 50 ,25)中取。大家可能發現了,rgb必須為整數,但是rand()只能rand實數。大家其實也注意到了有個” >>  0″,js當中表示位運算,整體向右移動n位,0就是移動0位。其實它的作用和Math.floor()一樣,但是速度更快。

動手畫!

  1. ctx.stroke(); 

這個線段就畫好了,是時候準備下它的分叉的時候了。

  1. newDepth = depth - 1;  
  2. if (!newDepth)  
  3. return; 

如果這個線段是***一級,就沒有分叉了,也是一個遞歸的終止條件。

  1. subBranches = (rand() * (maxBranch - 1)) + 1;  
  2. branchWidth *= 0.7;  
  3. for (var i = 0; i < subBranches; i++){  
  4. newAngle = angle + rand() * maxAngle - maxAngle * 0.5;  
  5. newLength = length * (0.7 + rand() * 0.3);  
  6. drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);  

分叉數是1~3中的一個數。然后有多少個分叉,就畫幾條線段,newAngle為原角度調整90度之內,新長度為原長度的0.7~1.0之間。

***畫出主干,這棵樹就可以開始畫了。

  1. drawTree(ctx, 320, 470, 60, -Math.PI / 2, 12, 12); 

大家可能注意到角度為負,不符合傳統觀念。但你要知道,畫布的縱坐標和傳統的坐標軸正好是相反的。

剩下可以發揮的東西還很多,比如大家可以調整各種參數,使樹的顏色、大小變化,或者用這種方法去做些其他的事~

打完收工~附上文件:tree.zip

原文鏈接:http://billyellow.com/?p=20

責任編輯:張偉 來源: Billyellow's
相關推薦

2012-06-04 10:16:18

HTML5

2012-06-12 09:53:14

HTML5

2011-11-09 10:05:26

HTML 5

2012-05-09 09:41:58

HTML5

2012-02-22 15:41:50

HTML 5

2011-11-25 14:20:57

HTML 5

2012-02-24 15:28:36

ibmdw

2012-05-29 09:57:10

HTML5

2017-07-05 16:22:09

HTML5canvas動態

2022-03-23 14:57:48

canvasjavascript運動小球

2011-07-21 15:34:36

iPhone HTML5 Canvas

2012-08-30 10:18:09

HTML5CanvasHTML5實例

2015-10-08 08:48:44

HTML5canvas動畫

2012-05-09 12:18:14

HTML5Canvas

2016-01-20 10:11:56

華麗CanvasHTML5

2011-07-18 13:35:14

HTML 5

2012-04-18 15:36:33

HTML5Canvas交互式

2012-05-31 09:54:13

HTML5

2013-03-06 16:14:16

UCHTML5游戲引擎

2014-02-11 11:21:00

html5工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区网址 | www在线视频| av天天干| 午夜视频一区二区 | 91av在线免费 | 欧美日韩淫片 | 亚洲一区二区三区免费观看 | 久久国产精品久久久久久 | 日韩成人免费av | 亚洲精品免费观看 | 精品久久久久香蕉网 | 亚洲欧洲中文 | 九九精品在线 | 久久久日韩精品一区二区三区 | 一区二区三区在线播放 | 色橹橹欧美在线观看视频高清 | 欧美炮房 | 免费毛片网站 | 国产精品成人一区二区 | 一区二区在线不卡 | 亚洲国产18| 成人久久18免费网站 | 日韩高清中文字幕 | 91精品国产综合久久久久久丝袜 | 亚洲一区精品视频 | 99re热这里只有精品视频 | 欧美激情一区 | 欧美精品一区二区三区四区 在线 | 一区二区福利视频 | 国产精品一卡 | 日韩一区二区在线视频 | 狠狠的干狠狠的操 | 一区二区三区视频在线观看 | 国产日韩精品在线 | 黄网免费看 | 97av视频在线观看 | 久久精品二区 | 欧美国产中文 | 中文字幕免费 | 日韩在线 | 日韩中文在线 |