经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JavaScript?Canvas绘制六边形网格
来源:jb51  时间:2022/1/17 10:44:01  对本文有异议

本文实例为大家分享了JavaScript Canvas绘制六边形网格的具体代码,供大家参考,具体内容如下

使用Canvas绘制六边形网格。

主要思路是先画给定中心点的六边形,然后二重循环遍历所有中心点,画所有的六边形。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <body>
  4.  
  5. <canvas id="myCanvas" width="300" height="150">
  6. ? ? <p>你的浏览器不支持Canvas</p>
  7. </canvas>
  8. <br>
  9. <p id='p1'></p>
  10. <script type="text/javascript">
  11. "use strict";
  12. var canvas=document.getElementById('myCanvas');
  13. if (canvas.getContext) {
  14. ? ? var k=3;
  15. ? ? var d=30;
  16. ? ? var w=Math.sqrt(3)*d;
  17. ? ? var h=3/2*d;
  18. ? ? canvas.width=2*k*w;
  19. ? ? canvas.height=2*k*h+h/2;
  20. ? ? var o=[canvas.width/2,canvas.height/2];
  21. ? ? document.getElementById('p1').innerHTML='画布宽'+canvas.width+',高'+canvas.height;
  22. ? ? var ctx=canvas.getContext('2d');
  23. ? ? ctx.fillStyle='AntiqueWhite';
  24. ? ? ctx.fillRect(0,0,canvas.width,canvas.height);
  25. ? ? ctx.strokeStyle='blue';
  26. ? ? ctx.beginPath();
  27. ? ? var vs=[[0,d],[-w/2,d/2],[-w/2,-d/2],
  28. ? ? ? ? ? ? [0,-d],[w/2,-d/2],[w/2,d/2]];
  29. ? ? function one(xo,yo){
  30. ? ? ? ? ctx.moveTo(xo+vs[5][0],yo+vs[5][1]);
  31. ? ? ? ? for(var i=0;i<vs.length;i++){
  32. ? ? ? ? ? ? ctx.lineTo(xo+vs[i][0],yo+vs[i][1]);
  33. ? ? ? ? }
  34. ? ? }
  35. ? ? for(var i=-k+1;i<k;i++){
  36. ? ? ? ? for(var j=0;j<2*k-1-Math.abs(i);j++){
  37. ? ? ? ? ? ? one(o[0]+(-k+1+Math.abs(i)/2+j)*w,o[1]+h*i);
  38. ? ? ? ? }
  39. ? ? }
  40. ? ? ctx.stroke();
  41. }
  42. else{
  43. ? ? console.log('你的浏览器不支持Canvas');
  44. }
  45. </script>
  46.  
  47. </body>
  48. </html>
  49.  

效果如下:

更新:增加了一些选项,边长和颜色可以设置。网页的图标也用六边形画出。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <title>六边形网格</title>
  5. <link id="link" rel="shortcut icon" type="image/x-icon">
  6. <style>
  7. #bc1,#bc2{width:25px;}
  8. #bj,#xt,#tc{width:20px;}
  9. </style>
  10. </head>
  11. <body>
  12. <p>设置大六边形边长: <input id='bc1' value="3" onchange="generate()"> 小六边形<br>
  13. 设置小六边形边长: <input id='bc2' value="24" onchange="generate()"> 像素(px)<br>
  14. 设置背景色 <input type="color" id="bj" value="#c8ffff" onchange="generate()"/>
  15. 设置线条色 <input type="color" id="xt" value="#0000ff" onchange="generate()"/>
  16. 设置填充色 <input type="color" id="tc" value="#faebd7" onchange="generate()"/></p>
  17. <p id='p1'></p>
  18. <canvas id="myCanvas" width="300" height="150">
  19. <p>你的浏览器不支持Canvas</p>
  20. </canvas>
  21. <script type="text/javascript">
  22. "use strict";
  23. document.getElementById('bc1').value=2;
  24. generate();
  25. link.href=myCanvas.toDataURL({format:'image/png', quality:1});
  26. document.getElementById('bc1').value=3;
  27. generate();
  28. function generate(){
  29. ? ? var bc1=document.getElementById('bc1').value;
  30. ? ? var bc2=document.getElementById('bc2').value;
  31. ? ? var k=Number(bc1);
  32. ? ? var d=Number(bc2);
  33. ? ? var bj=document.getElementById('bj').value;
  34. ? ? var xt=document.getElementById('xt').value;
  35. ? ? var tc=document.getElementById('tc').value;
  36. ? ? var canvas=document.getElementById('myCanvas');
  37. ? ? if(bc1>200){
  38. ? ? ? ? var c=confirm('六边形个数过多时网页会卡,是否继续?');
  39. ? ? ? ? if(!c){
  40. ? ? ? ? ? ? return;
  41. ? ? ? ? }
  42. ? ? }
  43. ? ? if(canvas.getContext) {
  44. ? ? ? ? var w=Math.sqrt(3)*d;
  45. ? ? ? ? var h=3/2*d;
  46. ? ? ? ? var count=3*k*k-3*k+1;
  47. ? ? ? ? canvas.width=2*k*w;
  48. ? ? ? ? canvas.height=2*k*h+h/2;
  49. ? ? ? ? var o=[canvas.width/2,canvas.height/2];
  50. ? ? ? ? document.getElementById('p1').innerHTML='画布宽'+canvas.width+'px,高'+canvas.height+'px,含有'+count+'个小六边形';
  51. ? ? ? ? var ctx=canvas.getContext('2d');
  52. ? ? ? ? ctx.fillStyle=bj;
  53. ? ? ? ? ctx.fillRect(0,0,canvas.width,canvas.height);
  54. ? ? ? ? ctx.beginPath();
  55. ? ? ? ? var vs=[[0,d],[-w/2,d/2],[-w/2,-d/2],[0,-d],[w/2,-d/2],[w/2,d/2]];
  56. ? ? ? ? function one(xo,yo){
  57. ? ? ? ? ? ? ctx.beginPath();
  58. ? ? ? ? ? ? ctx.moveTo(xo+vs[5][0],yo+vs[5][1]);
  59. ? ? ? ? ? ? for(var i=0;i<vs.length;i++){
  60. ? ? ? ? ? ? ? ? ctx.lineTo(xo+vs[i][0],yo+vs[i][1]);
  61. ? ? ? ? ? ? }
  62. ? ? ? ? ? ? ctx.strokeStyle=xt;
  63. ? ? ? ? ? ? ctx.lineWidth=2;
  64. ? ? ? ? ? ? ctx.stroke();
  65. ? ? ? ? ? ? ctx.fillStyle=tc;
  66. ? ? ? ? ? ? ctx.fill();
  67. ? ? ? ? }
  68. ? ? ? ? for(var i=-k+1;i<k;i++){
  69. ? ? ? ? ? ? for(var j=0;j<2*k-1-Math.abs(i);j++){
  70. ? ? ? ? ? ? ? ? one(o[0]+(-k+1+Math.abs(i)/2+j)*w,o[1]+h*i);
  71. ? ? ? ? ? ? }
  72. ? ? ? ? }
  73. ? ? }
  74. ? ? else{
  75. ? ? ? ? console.log('你的浏览器不支持Canvas');
  76. ? ? }
  77. }
  78. </script>
  79. </body>
  80. </html>

效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号