当前位置:Gxlcms > html代码 > canvas多边形的画法示例

canvas多边形的画法示例

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

本文主要介绍了canvas多边形(蜘蛛图)的画法示例的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

蜘蛛图的画法:

在开始之前,我们需要知道canvas是如何进行图像的绘制,canvas 元素用于在网页上绘制图形。HTML5 的 canvas 元素使用 JavaScript 在网页上绘制2D图像。 在矩形区域的画布上,控制其每一像素,JavaScript 来绘制 2D图形,逐像素进行渲染。可以通过多种方法使用canvas 元素绘制路径、矩形、圆形、字符以及添加图像。

* 注意!!!canvas 标签本身是不具备绘图功能,只能使用 JavaScript 在网页上绘制图像。

效果图如下所示:

1. 初始化js代码


上面代码中,通过一个立即执行函数,进行对所有的设置进行初始化,对于canvas正六边形的画法,可参见canvas画正六边形

在蜘蛛图中,我们可以进行拆分一下,通过画六边形,直线,圆圈的方式,分别进行完整个体的组件,然后通过方法进行统一调用绘制

如下面所示源代码:


  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>蜘蛛图canvas</title>
  6. <style type="text/css">
  7. canvas{
  8. }
  9. </style>
  10. </head>
  11. <body>
  12. <script type="text/javascript">
  13. var mW = 400;
  14. var mH = 400;
  15. var mData = [['法力', 77],['防御', 72],['生命值', 46],['物理伤害', 50],['回复值', 80],['耐力', 60]];
  16. var mCount = mData.length; //边数
  17. var mCenter = mW /2; //中心点
  18. var mRadius = mCenter - 100; //半径(减去的值用于给绘制的文本留空间)
  19. var mAngle = Math.PI * 2 / mCount; //角度
  20. var mCtx = null;
  21. var mColorPolygon = '#B8B8B8'; //多边形颜色
  22. var mColorLines = '#B8B8B8'; //顶点连线颜色
  23. var mColorText = '#000000';
  24. //初始化
  25. (function(){
  26. var canvas = document.createElement('canvas');
  27. document.body.appendChild(canvas);
  28. canvas.height = mH;
  29. canvas.width = mW;
  30. mCtx = canvas.getContext('2d');
  31. drawPolygon(mCtx);
  32. drawLines(mCtx);
  33. drawText(mCtx);
  34. drawRegion(mCtx);
  35. drawCircle(mCtx);
  36. })();
  37. // 绘制多边形边
  38. function drawPolygon(ctx){
  39. ctx.save(); // save the default state
  40. ctx.strokeStyle = mColorPolygon;
  41. var r = mRadius/ mCount; //单位半径
  42. //画6个圈
  43. for(var i = 0; i < mCount; i ++){
  44. ctx.beginPath(); //开始路径
  45. var currR = r * ( i + 1); //当前半径
  46. //画6条边
  47. for(var j = 0; j < mCount; j ++) {
  48. var x = mCenter + currR * Math.cos(mAngle * j);
  49. var y = mCenter + currR * Math.sin(mAngle * j);
  50. console.log('x:' + x, 'y:' + y);
  51. ctx.lineTo(x, y);
  52. }
  53. ctx.closePath(); //闭合路径
  54. ctx.stroke();
  55. }
  56. ctx.restore(); // restore to the default state
  57. }
  58. //顶点连线
  59. function drawLines(ctx){
  60. ctx.save();
  61. ctx.beginPath();
  62. ctx.strokeStyle = mColorLines;
  63. for(var i = 0; i < mCount; i ++){
  64. var x = mCenter + mRadius * Math.cos(mAngle * i);
  65. var y = mCenter + mRadius * Math.sin(mAngle * i);
  66. ctx.moveTo(mCenter, mCenter);
  67. ctx.lineTo(x, y);
  68. }
  69. ctx.stroke();
  70. ctx.restore();
  71. }
  72. //绘制文本
  73. function drawText(ctx){
  74. ctx.save();
  75. var fontSize = mCenter / 12;
  76. ctx.font = fontSize + 'px Microsoft Yahei';
  77. ctx.fillStyle = mColorText;
  78. for(var i = 0; i < mCount; i ++){
  79. var x = mCenter + mRadius * Math.cos(mAngle * i);
  80. var y = mCenter + mRadius * Math.sin(mAngle * i);
  81. if( mAngle * i >= 0 && mAngle * i <= Math.PI / 2 ){
  82. ctx.fillText(mData[i][0], x, y + fontSize);
  83. }else if(mAngle * i > Math.PI / 2 && mAngle * i <= Math.PI){
  84. ctx.fillText(mData[i][0], x - ctx.measureText(mData[i][0]).width, y + fontSize);
  85. }else if(mAngle * i > Math.PI && mAngle * i <= Math.PI * 3 / 2){
  86. ctx.fillText(mData[i][0], x - ctx.measureText(mData[i][0]).width, y);
  87. }else{
  88. ctx.fillText(mData[i][0], x, y);
  89. }
  90. }
  91. ctx.restore();
  92. }
  93. //绘制数据区域
  94. function drawRegion(ctx){
  95. ctx.save();
  96. ctx.beginPath();
  97. for(var i = 0; i < mCount; i ++){
  98. var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100;
  99. var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100;
  100. ctx.lineTo(x, y);
  101. }
  102. ctx.closePath();
  103. ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
  104. ctx.fill();
  105. ctx.restore();
  106. }
  107. //画点
  108. function drawCircle(ctx){
  109. ctx.save();
  110. var r = mCenter / 18;
  111. for(var i = 0; i < mCount; i ++){
  112. var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100;
  113. var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100;
  114. ctx.beginPath();
  115. ctx.arc(x, y, r, 0, Math.PI * 2);
  116. ctx.fillStyle = 'rgba(255, 0, 0, 0.8)';
  117. ctx.fill();
  118. }
  119. ctx.restore();
  120. }
  121. </script>
  122. </body>
  123. </html>

相关推荐:

CSS3创建多边形clip属性的实例

canvas绘制多边形

Mysql中判断一个点是否落在多边形内_MySQL

以上就是canvas多边形的画法示例的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行