当前位置:Gxlcms > JavaScript > canvas实现十二星座星空图

canvas实现十二星座星空图

时间:2021-07-01 10:21:17 帮助过:9人阅读

效果如下:

代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>canvas星座</title>
  6. <style>
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. #box{
  12. margin:10px 0 0 10px;;
  13. }
  14. input{
  15. outline: none;
  16. font-size:16px;
  17. }
  18. p{
  19. margin-bottom: 10px
  20. }
  21. input[type=date]{
  22. height:36px;
  23. text-indent:10px;
  24. }
  25. input[type=button]{
  26. background:#3A92FF;
  27. color:white;
  28. border: none;
  29. height:40px;
  30. padding:0 10px;
  31. margin-left: -2px;
  32. }
  33. #canvas{
  34. margin-left:10px;
  35. background-color: #000;
  36. display: none;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <div id="box">
  42. <p>请选择您的出生日期</p>
  43. <input type="date" id="birth"><input type="button" id="btn" value="展示我的星空图">
  44. </div>
  45.  <canvas id="canvas" width="550" height="550">你的浏览器不支持canvas</canvas>
  46. <script type="text/javascript">
  47. var box=document.getElementById('box');
  48. var birth=document.getElementById('birth');
  49. var btn=document.getElementById('btn');
  50. var canvas=document.getElementById("canvas");
  51. var ctx=canvas.getContext("2d");
  52. var g1,date,timer;
  53. ctx.font = "30px Courier New";
  54. /*星座位置*/
  55. var star={
  56. "白羊座":[
  57. [[0.30,0.78],[0.34,0.66],[0.28,0.48],[0.60,0.26],[0.65,0.20],[0.71,0.23],[0.70,0.32],[0.72,0.36]],
  58. [ [0,1,2,3,4,5],[3,6,7]]
  59. ],
  60. "天秤座":[
  61. [[0.16,0.67],[0.34,0.60],[0.60,0.27],[0.75,0.23],[0.84,0.47],[0.63,0.74],[0.51,0.78]],
  62. [[0,1,2,3,4,5,6]]
  63. ],
  64. "摩羯座":[
  65. [[0.78,0.21],[0.78,0.34],[0.75,0.45],[0.75,0.70],[0.69,0.78],[0.31,0.66],[0.22,0.49],[0.30,0.53],[0.53,0.54]],
  66. [[0,1,2,3,4,5,6,7,8,1]]
  67. ],
  68. "水瓶座":[
  69. [[0.45,0.21],[0.37,0.35],[0.27,0.51],[0.30,0.58],[0.29,0.64],[0.48,0.79],[0.51,0.71],[0.58,0.68],[0.73,0.74],[0.43,0.53],[0.53,0.47]],
  70. [[0,1,2,3,4,5,6,7,8],[2,9,10]]
  71. ],
  72. "双鱼座":[
  73. [[0.28,0.43],[0.28,0.53],[0.36,0.73],[0.43,0.78],[0.50,0.70],[0.53,0.62],[0.57,0.58],[0.63,0.43],[0.67,0.39],[0.74,0.39],[0.77,0.34],[0.72,0.30],[0.75,0.22],[0.23,0.50],[0.66,0.33]],
  74. [[0,1,2,3,4,5,6,7,8,9,10,11,12],[0,13,1],[8,14,11]]
  75. ],
  76. "金牛座":[
  77. [[0.29,0.21],[0.39,0.36],[0.50,0.51],[0.50,0.57],[0.61,0.63],[0.77,0.71],[0.79,0.79],[0.22,0.43],[0.39,0.57],[0.60,0.71],[0.67,0.76]],
  78. [[0,1,2,3,4,5,6],[7,8,3],[4,9,10]]
  79. ],
  80. "双子座":[
  81. [[0.18,0.37],[0.25,0.45],[0.35,0.55],[0.39,0.68],[0.49,0.77],[0.51,0.63],[0.57,0.78],[0.28,0.29],[0.42,0.32],[0.61,0.49],[0.72,0.60],[0.83,0.59],[0.69,0.75],[0.22,0.54],[0.35,0.43],[0.48,0.21]],
  82. [[0,1,2,3,4],[2,5,6],[7,8,9,10,11],[9,12],[13,1,14,8,15]]
  83. ],
  84. "巨蟹座":[
  85. [ [0.16,0.39],[0.27,0.36],[0.52,0.49],[0.57,0.65],[0.83,0.78],[0.44,0.21]],
  86. [[0,1,2,3,4],[2,5]]
  87. ],
  88. "狮子座":[
  89. [
  90. [0.16,0.75],[0.23,0.67],[0.39,0.77],[0.71,0.53],[0.64,0.39],[0.55,0.37],[0.47,0.27],[0.54,0.24],[0.60,0.27],[0.85,0.56]],
  91. [[0,1,2,3,4,5,6,7,8],[3,9]]
  92. ],
  93. "处女座":[
  94. [[0.16,0.59],[0.35,0.63],[0.44,0.70],[0.62,0.51],[0.77,0.46],[0.84,0.37],[0.60,0.42],[0.65,0.26],[0.34,0.75]],
  95. [[0,1,2,3,4,5],[3,6,7],[2,8]]
  96. ],
  97. "天蝎座":[
  98. [[0.17,0.50],[0.28,0.63],[0.19,0.70],[0.28,0.78],[0.41,0.77],[0.49,0.72],[0.57,0.55],[0.59,0.44],[0.69,0.31],[0.74,0.21],[0.82,0.29],[0.79,0.44],[0.73,0.50],[0.38,0.47]],
  99. [[0,1,2,3,4,5,6,7,8,9,10,11,12],[1,13],[8,11]]
  100. ],
  101. "射手座":[
  102. [[0.22, 0.66],[0.24,0.51],[0.45,0.40],[0.54,0.37],[0.59,0.43],[0.66,0.50],[0.63,0.60],[0.66,0.67],[0.74,0.53],[0.77,0.39],[0.49,0.47],[0.29,0.68],[0.30,0.78],[0.48,0.21],[0.52,0.27],[0.59,0.29]],
  103. [[0,1,2,3,4,5,6,7,8,9],[2,10,11,12],[10,4],[13,14,15,3],[14,3]]
  104. ]
  105. };
  106. /*根据出生日期获取星座信息*/
  107. function getStarSign(ts){
  108. var d=new Date(ts),sign=d.getMonth()*100+d.getDate();
  109. switch(true)
  110. {
  111. case sign<20:
  112. return "摩羯座";
  113. case sign<119:
  114. return "水瓶座";
  115. case sign<221:
  116. return "双鱼座";
  117. case sign<320:
  118. return "白羊座";
  119. case sign<421:
  120. return "金牛座";
  121. case sign<522:
  122. return "双子座";
  123. case sign<623:
  124. return "巨蟹座";
  125. case sign<723:
  126. return "狮子座";
  127. case sign<823:
  128. return "处女座";
  129. case sign<923:
  130. return "天秤座";
  131. case sign<1022:
  132. return "天蝎座";
  133. case sign<1122:
  134. return "射手座";
  135. default:
  136. return "摩羯座";
  137. }
  138. }
  139. /*绘制星座*/
  140. function constellation(ctx,ary,w,h){
  141. /*创建线条*/
  142. var points=ary[0], lines=ary[1];
  143. ctx.strokeStyle="#FFF";
  144. var len=lines.length,i,ii,line,point;
  145. ctx.beginPath();
  146. while(len--)
  147. {
  148. i=1;
  149. line=lines[len];
  150. ii=line.length;
  151. point=points[line[0]];
  152. ctx.moveTo(point[0]*w,point[1]*h);
  153. for(;i<ii;i++){
  154. point=points[line[i]];
  155. ctx.lineTo(point[0]*w,point[1]*h);
  156. }
  157. }
  158. ctx.stroke();
  159. /*创建小圆*/
  160. var cur;
  161. i=0;
  162. ii=points.length;
  163. for(;i<ii;i++){
  164. cur=points[i];
  165. new Circle(cur[0]*w,cur[1]*h).draw();//new出实例
  166. }
  167. }
  168. /*创建小圆的构造函数*/
  169. function Circle(x,y,r){
  170. this.x=x;
  171. this.y=y;
  172. this.r=r||Math.round(Math.random()*8+4);
  173. }
  174. Circle.prototype={
  175. draw:function(){
  176. ctx.beginPath();
  177. g1=ctx.createRadialGradient(this.x,this.y,Math.round(Math.random()*1+1),this.x,this.y,Math.round(Math.random()*3+6));
  178. g1.addColorStop(0,'rgba(255,255,255,.9)');
  179. g1.addColorStop(1,'rgba(0,0,0,.1)');
  180. ctx.arc(this.x,this.y,this.r,0,Math.PI*2,true);
  181. ctx.fillStyle =g1;
  182. ctx.closePath();
  183. ctx.fill();
  184. return this;
  185. }};
  186. /*点击‘展示我的星空图'按钮*/
  187. btn.onclick=function(e){
  188. clearInterval(timer);
  189. e.preventDefault();
  190. if (!birth.value){
  191. alert("请选择您的出生日期");
  192. }else{
  193. canvas.style.display="block";
  194. date = new Date(birth.value.replace(/-/g,'/')).getTime();
  195. timer=setInterval(function(){
  196. ctx.clearRect(0,0,canvas.width,canvas.height);
  197. ctx.strokeText(getStarSign(date), 50, 50);
  198. constellation(ctx,star[getStarSign(date)],canvas.width,canvas.height);
  199. },500);
  200. }
  201. };
  202. </script>
  203. </body>
  204. </html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

人气教程排行