日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

html制作动态坐标轴,HTML5 canvas制作动态随机星图

發布時間:2024/9/18 HTML 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html制作动态坐标轴,HTML5 canvas制作动态随机星图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

8種機械鍵盤軸體對比

本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?

本篇將會介紹如何用canvas制作動態隨機移動的星圖啦啦啦

小白在遠離小白道路上的第一步就是搭個博客

前言

這次的博文不是接著進行博客布置的教學了,對的,我棄坑了,也許以后會回來補

用HMTL5+canvas畫東西也很好玩嘛,來來來,我們來畫那種會隨機動來動去的星圖。先展示一個demo

demo訪問地址:動態星圖demo

準備

這一段就叫它正文好了

首先建立html文件1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

canvas star demo

body{

text-align: center;

overflow: hidden;

background: #C4C6C8;

}

因為我假定你已經有基礎或者已經看完了我貼在上面的速成教程,這一段代碼就不加以贅述了,接下來是js代碼的編寫

變量的定義1

2

3

4

5

6

7

8

9

10var width = window.innerWidth,

height = window.innerHeight,

amount = 50; //出現在畫布上的星星個數

var cs = document.getElementById('mycanvas'),//獲得canvas元素

cont = cs.getContext('2d'); //對canvas元素進行2d渲染,此后的對畫布操作即對cont的操作

cs.width = width;

cs.height = height;

//設置canvas元素的尺寸為瀏覽器視窗的尺寸

cont.strokeWidth = 1; //設置描邊寬度

這一段代碼設置了基本的樣式和尺寸,接下來就是著手制作星團了

星團對象的定義

要完成星團對象的定義,我們可以先對想要達到的效果進行逐步分析、拆解,再對其內部屬性和方法進行不斷完善先做一個不會動的星團,星團里的所有星星需要一個數組來存儲,數組里存儲的應該是星星的圓心坐標

需要有一個畫星星的方法,就命名為drawStar好了

在demo里看到每個星星都連著其他星星,好帶感,所以需要一個畫線的方法,就將畫線的方法命名為drawLine,連線的方法命名為linkStar好了

每個星星的出現的位置應該是隨機的,需要一個產生合適隨機數的方法,但是這個方法也許不單單用來產生隨機位置,還有隨機半徑等等,所以就欽定為randomNum吧

這里需要一個方法將上面的幾個工具方法組合起來,繪制出完整的星圖,不是很會起名了,就叫initStars好了,盡管不是很順口

以上幾個方法足夠產生一個靜態的隨機星圖了,要讓它動起來的話,還需要一個能夠讓星圖動起來的方法,對的,moveStars

到這里的話,已經初步將對象里需要的方法和屬性定義好了,接下來是一步步地實現

屬性和各工具方法的定義1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35var Stars = {

starArr: [], //定義星團數組

drawStar: function(cxt,x,y,r){

//cxt為傳入的畫布對象,(x,y)為星星的圓心坐標,r為星星的半徑

cxt.beginPath(); //創建路徑

cxt.arc(x,y,r,0,2*Math.PI); //畫一個圓

cxt.closePath(); //閉合路徑

cxt.fill(); //填充

return{x:x,y:y,r:r}; //返回圓心坐標和半徑的對象

},

drawLine: function(cxt,x,y,ex,ey){

//(x,y),(ex,ey)分別為線段的起點和終點坐標

cxt.beginPath();

cxt.strokeStyle = "rgba(0,0,0,1)";//為線段定義描邊樣式

cxt.moveTo(x,y);

cxt.lineTo(ex,ey);

cxt.closePath();

cxt.stroke(); //描邊

},

randomNum: function(max,min){

return Math.floor(Math.random()*(max-min+1)+min);

//完成基本的產生范圍內隨機數的要求

},

linkStar: function(){

var pStars = this; //創建指針指向調用該方法的Stars對象

for(let i = 0;i < amount;i++){

for(let j = 0;j < amount && i+j < amount;j++){

pStars.drawLine(cont,

pStars.starArr[i+j].x,pStars.starArr[i+j].y,

pStars.starArr[i].x,pStars.starArr[i].y)

}

}

},

...

}

到這一步,我們已經把Stars對象里需要用到的工具方法的定義工作完成了

完成星圖的靜態模型

到這里,我們再整理一遍這個方法需要完成的功能:組合各個工具函數繪制出靜態的星圖

代碼如下1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17var Stars = {

...

initStars: function(cont){

var pStars = this;

pStars.starArr = []; //初始化為空數組

cont.clearRect(0,0,cs.width,cs.height);//順手清理畫布

for(let i = 0;i < amount;i++){

pStars.starArr.push(pStars.drawStar(cont,

pStars.randomNum(width,0), //隨機生成星星的橫坐標

pStars.randomNum(height,0), //隨機生成星星的縱坐標

pStars.randomNum(2,15) //隨機生成星星的半徑

));

//返回對象{x:x,y:y,r:r}到starArr

}

pStars.linkStar(); //連線

},

}

按上述步驟簡單組織后,效果如圖所示

如果你的和我的不一樣,那你肯定哪里出問題了。。

美化

這個靜態星圖的效果很驚悚沒錯。。需要稍微美化一下。。

首先,在js代碼的頭部定義變量處加入1cont.fillStyle = "rgba(0,0,0,0.05)"; //設置填充樣式

接著,修改線段的顏色深淺,我們希望每條線段有不同的深淺度,最好是和線段的長度存在一定關系先修改方法drawLine1

2

3

4

5

6

7

8

9drawLine: function(cxt,x,y,ex,ey,o){

//(x,y),(ex,ey)分別為線段的起點和終點坐標,o為透明度

cxt.beginPath();

cxt.strokeStyle = 'rgba(0,0,0,'+o+')';//為線段定義描邊樣式

cxt.moveTo(x,y);

cxt.lineTo(ex,ey);

cxt.closePath();

cxt.stroke(); //描邊

}

修改方法linkStar1

2

3

4

5

6

7

8

9

10

11

12

13

14

15linkStar: function(){

var pStars = this; //創建指針指向調用該方法的Stars對象

for(let i = 0;i < amount;i++){

for(let j = 0;j < amount && i+j < amount;j++){

var xx = Math.abs(pStars.starArr[i+j].x - pStars.starArr[i].x),

yy = Math.abs(pStars.starArr[i+j].y - pStars.starArr[i].y),

line = Math.sqrt(xx*xx,yy*yy),

o = 1/line*7-0.009;

o= o > 0.05 ? 0.05 :o;

pStars.drawLine(cont,

pStars.starArr[i+j].x,pStars.starArr[i+j].y,

pStars.starArr[i].x,pStars.starArr[i].y,o)

}

}

}

修改之后,會呈現如下圖效果

完成星圖的動態模型

接下來就是制作動態星圖的模型了,要實現canvas的動畫效果,普遍的做法是在經過一定時間間隔后進行重繪。如此,一個較為簡單且容易想到的思路就出現了,經過初始化后的靜態星圖模型已經將所有星星的的坐標存放于數組starArr中,只需要在清理畫布后,將數組內的坐標加上適當偏移后繪制出來,即可達到想要的動態效果。為此,我們需要在對象數組starArr中為對象添加其他屬性1

2

3

4

5

6

7

8

9

10

11var Stars = {

...

moveStars: function(){

var pStars = this;

for(let i = 0;i < amount;i++){

pStars.starArr[i].moveX = pStars.randomNum(10,-10)/40;

pStars.starArr[i].moveY = pStars.randomNum(10,-10)/40;

}

...

}

}

上面的代碼已經為對象數組中的元素添加了新的屬性,即偏移量,接下來就是設置定時器使星圖重繪了1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19var Stars = {

...

moveStars: function(){

...

setInterval(function(){

cont.clearRect(0,0,cs.width,cs.height); //清理

for(let i = amount - 1;i >= 0;i--){

var star = pStars.starArr[i];

star.x += star.moveX;

star.y += star.moveY;

//完成偏移

star.x < 0 ? (star.x = cs.width) : (star.x > cs.width ? star.x = 0 : '');

star.y < 0 ? (star.y = cs.height) : (star.y > cs.height ? star.y = 0 : '');

Stars.drawStar(cont,star.x,star.y,star.r);

}

Stars.linkStar();

},50)

}

}

至此,就已經將對象的方法和屬性全定義完啦,最后一步就是組織js函數調用這個對象

調用1

2

3

4window.onload = function(){

Stars.initStars(cont);

Stars.moveStars();

}

組合之后,就能夠顯示出動態星圖的效果啦

美化二

本來想做美化的,做成真正星星那樣,但是好麻煩啊,先留著坑,有空再做好了(其實后來作者棄坑了,被繁重的學業壓垮了脊梁)

全部代碼1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

canvas star demo

body {

text-align: center;

overflow: hidden;

background: #C4C6C8;

}

var width = window.innerWidth,

height = window.innerHeight,

//獲取瀏覽器視窗的尺寸

amount = 50; //出現在畫布上的星星個數

var cs = document.getElementById('mycanvas'), //獲得canvas元素

cont = cs.getContext('2d'); //對canvas元素進行2d渲染,此后的對畫布操作即對cont的操作

cs.width = width;

cs.height = height;

//設置canvas元素的尺寸為瀏覽器視窗的尺寸

cont.fillStyle = "rgba(0,0,0,0.15)"; //設置填充樣式

cont.strokeWidth = 1; //設置描邊寬度

var Stars = {

starArr: [], //定義星團數組

drawStar: function(cxt, x, y, r) {

//cxt為傳入的畫布對象,(x,y)為星星的圓心坐標,r為星星的半徑

cxt.beginPath(); //創建路徑

cxt.arc(x, y, r, 0, 2 * Math.PI); //畫一個圓

cxt.closePath(); //閉合路徑

cxt.fill(); //填充

return {

x: x,

y: y,

r: r

};

//返回圓心坐標的對象

},

drawLine: function(cxt, x, y, ex, ey, o) {

//(x,y),(ex,ey)分別為線段的起點和終點坐標,o為透明度

cxt.beginPath();

cxt.strokeStyle = 'rgba(0,0,0,' + o + ')';//為線段定義描邊樣式

cxt.moveTo(x, y);

cxt.lineTo(ex, ey);

cxt.closePath();

cxt.stroke(); //描邊

},

randomNum: function(max, min) {

return Math.floor(Math.random() * (max - min + 1) + min);

//完成基本的產生范圍內隨機數的要求

},

linkStar: function() {

var pStars = this; //創建指針指向調用該方法的Stars對象

for (let i = 0; i < amount; i++) {

for (let j = 0; j < amount && i + j < amount; j++) {

var xx = Math.abs(pStars.starArr[i + j].x - pStars.starArr[i].x),

yy = Math.abs(pStars.starArr[i + j].y - pStars.starArr[i].y),

line = Math.sqrt(xx * xx, yy * yy),

o = 1 / line * 7 - 0.009;

o = o > 0.05 ? 0.05 : o;

pStars.drawLine(cont,

pStars.starArr[i + j].x, pStars.starArr[i + j].y,

pStars.starArr[i].x, pStars.starArr[i].y, o)

}

}

},

initStars: function(cont) {

var pStars = this;

pStars.starArr = []; //初始化為空數組

cont.clearRect(0, 0, cs.width, cs.height);//順手清理畫布

for (let i = 0; i < amount; i++) {

pStars.starArr.push(pStars.drawStar(cont, pStars.randomNum(width, 0), pStars.randomNum(height, 0), pStars.randomNum(2, 15)));

//返回對象{x:x,y:y}到starArr

}

pStars.linkStar(); //連線

},

moveStars: function() {

var pStars = this;

for (let i = 0; i < amount; i++) {

pStars.starArr[i].moveX = pStars.randomNum(10, -10) / 40;

pStars.starArr[i].moveY = pStars.randomNum(10, -10) / 40;

}

setInterval(function() {

cont.clearRect(0, 0, cs.width, cs.height);

for (let i = amount - 1; i >= 0; i--) {

var star = this.Stars.starArr[i];

star.x += star.moveX;

star.y += star.moveY;

//完成偏移

star.x < 0 ? (star.x = cs.width) : (star.x > cs.width ? star.x = 0 : '');

star.y < 0 ? (star.y = cs.height) : (star.y > cs.height ? star.y = 0 : '');

Stars.drawStar(cont, star.x, star.y, star.r);

}

Stars.linkStar();

}, 50);

}

}

window.onload = function() {

Stars.initStars(cont);

Stars.moveStars();

}

結語1

2

3

4

5

6

7

8

9

10

11

12function (){

count: 0;

addBlog: function(){

count++;

}

log: function(str){

console.log(str);

}

var 人生成就 = new Achievement();

人生成就.addBlog();

人生成就.log("前端博客++");

總結

以上是生活随笔為你收集整理的html制作动态坐标轴,HTML5 canvas制作动态随机星图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。