radar.html 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style type="text/css">
  7. canvas{
  8. }
  9. </style>
  10. </head>
  11. <body>
  12. <script type="text/javascript">
  13. var mW = 200;
  14. var mH = 200;
  15. var mData = [
  16. ['原理认知', 21],
  17. ['实景勘察', 56],
  18. ['虚拟技术搭建', 46],
  19. ['虚拟艺术创作', 50],
  20. ['虚拟资源库建设', 80]
  21. ];
  22. var mCount = mData.length; //边数
  23. var mCenter = mW /2; //中心点
  24. var mRadius = mCenter - 50; //半径(减去的值用于给绘制的文本留空间)
  25. var mAngle = Math.PI * 2 / mCount; //角度
  26. var mCtx = null;
  27. var mColorPolygon = '#B8B8B8'; //多边形颜色
  28. var mColorLines = '#B8B8B8'; //顶点连线颜色
  29. var mColorText = '#000000';
  30. //初始化
  31. (function(){
  32. var canvas = document.createElement('canvas');
  33. document.body.appendChild(canvas);
  34. canvas.height = mH;
  35. canvas.width = mW;
  36. mCtx = canvas.getContext('2d');
  37. drawPolygon(mCtx);
  38. drawLines(mCtx);
  39. drawRegion(mCtx);
  40. drawText(mCtx);
  41. drawCircle(mCtx);
  42. drawLines1(mCtx)
  43. })();
  44. // 绘制多边形边
  45. function drawPolygon(ctx){
  46. ctx.save();
  47. ctx.strokeStyle = mColorPolygon;
  48. var r = mRadius/ mCount; //单位半径
  49. // var r = mRadius/ (mCount-2); //单位半径 画三个五边形
  50. //画5个圈
  51. for(var i = 0; i < mCount; i ++){
  52. // for(var i = 0; i < mCount-2; i ++){ // 画三个五边形
  53. ctx.beginPath();
  54. var currR = r * ( i + 1); //当前半径
  55. //画5条边
  56. for(var j = 0; j < mCount; j ++){
  57. var x = mCenter + currR * Math.cos(mAngle * j);
  58. var y = mCenter + currR * Math.sin(mAngle * j);
  59. ctx.lineTo(x, y);
  60. }
  61. ctx.closePath()
  62. ctx.stroke();
  63. }
  64. ctx.restore();
  65. }
  66. //顶点连线
  67. function drawLines(ctx){
  68. ctx.save();
  69. ctx.beginPath();
  70. ctx.strokeStyle = mColorLines;
  71. for(var i = 0; i < mCount; i ++){
  72. var x = mCenter + mRadius * Math.cos(mAngle * i);
  73. var y = mCenter + mRadius * Math.sin(mAngle * i);
  74. ctx.moveTo(mCenter, mCenter);
  75. ctx.lineTo(x, y);
  76. }
  77. ctx.stroke();
  78. ctx.restore();
  79. }
  80. //数据点之间的连线
  81. function drawLines1(ctx){
  82. ctx.save();
  83. ctx.beginPath();
  84. var count = 0;
  85. for(var i = 0; i < mCount; i ++){
  86. var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100;
  87. var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100;
  88. count = i + 1;
  89. if (count < mCount) {
  90. var x1 = mCenter + mRadius * Math.cos(mAngle * (i+1)) * mData[i+1][1] / 100;
  91. var y1 = mCenter + mRadius * Math.sin(mAngle * (i+1)) * mData[i+1][1] / 100;
  92. }else{
  93. var x1 = mCenter + mRadius * Math.cos(mAngle * 0) * mData[0][1] / 100;
  94. var y1 = mCenter + mRadius * Math.sin(mAngle * 0) * mData[0][1] / 100;
  95. }
  96. ctx.moveTo(x, y);
  97. ctx.lineTo(x1, y1);
  98. ctx.lineWidth = 2; //设置线宽状态
  99. ctx.strokeStyle = '#1478FA'; //设置线的颜色状态
  100. }
  101. ctx.stroke();
  102. ctx.restore();
  103. }
  104. //绘制文本
  105. function drawText(ctx){
  106. ctx.save();
  107. var fontSize = mCenter / 12;
  108. ctx.font = fontSize + 'px Microsoft Yahei';
  109. ctx.fillStyle = mColorText;
  110. for(var i = 0; i < mCount; i ++){
  111. var x = mCenter + mRadius * Math.cos(mAngle * i);
  112. var y = mCenter + mRadius * Math.sin(mAngle * i);
  113. if( mAngle * i >= 0 && mAngle * i <= Math.PI / 2 ){
  114. ctx.fillText(mData[i][0], x, y + fontSize);
  115. }else if(mAngle * i > Math.PI / 2 && mAngle * i <= Math.PI){
  116. ctx.fillText(mData[i][0], x - ctx.measureText(mData[i][0]).width, y + fontSize);
  117. }else if(mAngle * i > Math.PI && mAngle * i <= Math.PI * 3 / 2){
  118. ctx.fillText(mData[i][0], x - ctx.measureText(mData[i][0]).width, y);
  119. }else{
  120. ctx.fillText(mData[i][0], x, y);
  121. }
  122. }
  123. //中心绘制文字
  124. ctx.font="bold 36px Arial"
  125. ctx.fillStyle='#1478FA'
  126. ctx.fillText("75",mCenter-18,mCenter+16);
  127. ctx.restore();
  128. }
  129. //绘制数据区域
  130. function drawRegion(ctx){
  131. ctx.save();
  132. ctx.beginPath();
  133. for(var i = 0; i < mCount; i ++){
  134. var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100;
  135. var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100;
  136. ctx.lineTo(x, y);
  137. }
  138. ctx.closePath();
  139. ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
  140. ctx.fill();
  141. ctx.restore();
  142. }
  143. //画点
  144. function drawCircle(ctx){
  145. ctx.save();
  146. var r = mCenter / 50;
  147. for(var i = 0; i < mCount; i ++){
  148. var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100;
  149. var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100;
  150. ctx.beginPath();
  151. ctx.arc(x, y, r, 0, Math.PI * 2);
  152. ctx.fillStyle = 'rgba(20, 120, 250, 0.8)';
  153. ctx.fill();
  154. }
  155. ctx.restore();
  156. }
  157. </script>
  158. </body>
  159. </html>