帆布如何实现一个六边形能力图

  介绍

这篇文章将为大家详细讲解有关帆布如何实现一个六边形能力图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>一、前言

六边形能力图如下,由6个六边形组成,每一个顶点代表其在某一方面的能力。这篇文章我们就来看看如何基于画布去绘制这么一个六边形能力图。当然,你也可以基于其他开源的js方案来实现,如EChars。js等。

帆布如何实现一个六边形能力图”>,</p> <p> <强>二、六边形绘制基础</强> </p> <p>六边形能力图有6个六边形组成,那我们只要绘制出一个,另外5个则依次减小六边形的边长即可。那我们首先来分析一下,如何绘制出一个六边形。</p> <p> <img src=

如上图,绘制一个六边形有以下几个关键点:

1。紫色矩形区域我们可以看成是帆布的画布。其大小可以认为是(宽度、高度).center (centerX centerY)是其中心点,即(宽/2,高/2).

2。绘制六边形的关键是计算出它的6个顶点的坐标。而如上图所示,这里面最关键的又是计算出六边形所在矩形区域的左上角坐标(左)。对照上图,(左)的计算公式如下。

帆布如何实现一个六边形能力图

要计算出(左)需要先计算出x, y,而x, y的值与六边形的边长有关。

3。如上的x, y的计算公式为

帆布如何实现一个六边形能力图

4。因此,X1 (X1, y1, X2 (X2, y2), X3 (X3, y3), X4 (X4, y4), X5 (X5,日元),X6 (X6,日元)的坐标计算为

帆布如何实现一个六边形能力图”> <img src=

因此,得到绘制六边形的代码为:

function  computeHexagonPoints(宽度、高度,祝福;边缘),{   ,,,let  centerX =, width /, 2;   ,,,let  centerY =, height /, 2;   ,,,let  x =, edge  *, Math.sqrt (3),/, 2;   ,,,let  left =, centerX 作用;x;   ,,,let  x1, x2, x3, x4, x5, x6;   ,,,let  y1, y2, y3、y4,日元,日元;   ,,,x5 =, x6 =,离开;   ,,,x2 =, x3 =, left  +, x  *, 2;   ,,,x1 =, x4 =, left  +, x;      ,,,let  y =, edge /, 2;   ,,,let  top =, centerY 作用;2,*,y;   ,,,y1 =,最高;   ,,,y2 =, y6 =, top  +, y;   ,,,y3 =, y5 =, top  +, 3, *, y;   ,,,y4 =, top  +, 4, *, y;      ,,,let  points =, new 数组();   ,,,点[0],=,(x1, y1);   ,,,点[1],=,(x2, y2);   ,,,点[2],=,(x3,, y3);   ,,,点[3],=,(x4, y4);   ,,,点[4],=,(x5,日元);   ,,,点[5],=,(x6,日元);   ,,,return 点;   以前,,}

<强>三,绘制六维能力图

, <强> 3.1绘制6个六边形

基于画布上绘制,首先就是需要获取背景。

_context =, canvas.getContext (& # 39; 2 d # 39;);

而绘制的话,已经知道6个顶点了,那只需要将这6个点用连线的方式连接起来就可以了。主要用到函数(x, y)和画线(x, y)两个方法。这里总共需要绘制6个六边形,那只要按等比例减小边的值就可以了。因此绘制六边形能力图的主要代码如下。

function  drawHexagonInner(边缘),{   ,,,_context.strokeStyle =, _color;   ,,,for  (var 小姐:=,0;,小姐:& lt;, 6;,我+ +),{   ,,,,,_allPoints[我],=,computeHexagonPoints (_width, _height,, edge 作用;小姐:*,edge /, 5);   ,,,,,_context.beginPath ();   ,,,,,_context.moveTo (_allPoints[我][5][0],_allPoints[我][5][1]);   ,,,,,for  (var  j =, 0;, j  & lt;, 6。, j + +), {   ,,,,,,,_context.lineTo (_allPoints[我][j] [0], _allPoints[我][j] [1]);   ,,,,,}   ,,,,,_context.closePath ();   ,,,,,_context.stroke ();   ,,,}   以前,,}

代码中还有3个相关的API.beginPath()和closePath()主要就是绘制得到一个封闭的路径.stroke()主要是得到一个镂空的形状。当然,相应的就有填满()得到填充的形状。

3.2绘制3条直线

帆布如何实现一个六边形能力图