iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Canvas如何实现一个六边形能力图
  • 763
分享到

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

2023-06-09 21:06:48 763人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关canvas如何实现一个六边形能力图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言六边形能力图如下,由 6 个 六边形组成,每一个顶点代表其在某一方面的能力。这篇文章我

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

一、前言

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

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

二、六边形绘制基础

六边形能力图有 6 个 六边形组成,那我们只要绘制出一个,另外 5 个则依次减小六边形的边长即可。那我们首先来分析一下,如何绘制出一个六边形。

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

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

紫色矩形区域我们可以看成是 canvas 的画布。其大小可以认为是 (width,height)。center(centerX,centerY) 是其中心点,即 (width / 2, height / 2)。

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

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

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

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

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

因此,X1(x1,y1),X2(x2,y2),X3(x3,y3),X4(x4,y4),X5(x5,y5),X6(x6,y6) 的坐标计算为

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

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

function computeHexaGonPoints(width, height, edge) {    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,y5,y6;    x5 = x6 = left;    x2 = x3 = left + x * 2;    x1 = x4 = left + x;    let y = edge / 2;    let top = centerY - 2 * y;    y1 = top;    y2 = y6 = top + y;    y3 = y5 = top + 3 * y;    y4 = top + 4 * y;    let points = new Array();    points[0] = [x1, y1];    points[1] = [x2, y2];    points[2] = [x3, y3];    points[3] = [x4, y4];    points[4] = [x5, y5];    points[5] = [x6, y6];    return points;  }

三、绘制六维能力图

 3.1 绘制 6 个六边形

基于 canvas 绘制,首先就是需要获取 context。

_context = canvas.getContext('2d');

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

function drawHexagonInner(edge) {    _context.strokeStyle = _color;    for (var i = 0; i < 6; i++) {      _allPoints[i] = computeHexagonPoints(_width, _height, edge - i * edge / 5);      _context.beginPath();      _context.moveTo(_allPoints[i][5][0],_allPoints[i][5][1]);      for (var j = 0; j < 6; j++) {        _context.lineTo(_allPoints[i][j][0],_allPoints[i][j][1]);      }      _context.closePath();      _context.stroke();    }  }

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

2 绘制 3 条直线

绘制那 3 条直线也是比较简单的,只要将 X1和X4 连接,将X2 和 X5 相连,将 X3 和 X6 相连。代码如下:

function drawLines() {    _context.beginPath();    _context.strokeStyle = _color;    for (let i = 0; i < 3; i++) {      _context.moveTo(_allPoints[0][i][0],_allPoints[0][i][1]); //1-4      _context.lineTo(_allPoints[0][i+3][0],_allPoints[0][i+3][1]); //1-4      _context.stroke();    }    _context.closePath();  }

3.3 绘制覆盖图

6 个顶点代表了六种能力,比如这里的各科成绩,把六种能力封闭成一个闭合路径并填充则称为覆盖图。要绘制出覆盖图,这里需要计算出六个顶点。6 个顶点可以通过最外围的六边形的 6 个顶点和中心点来计算。简单来说就是通过能力得分,在顶点到中心距离的占比来计算。计算公式如下。

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

代码如下

  function drawCover() {    let tmpCoverPoints = _allPoints[0];    _coverPoints = [];    console.log("coverPoints ",tmpCoverPoints)    let centerX = _width / 2;    let centerY = _height / 2;    for (let i = 0; i < tmpCoverPoints.length; i++) {      _coverPoints.push([        centerX + (tmpCoverPoints[i][0] - centerX) * (_data[i].score / 100.0),        centerX + (tmpCoverPoints[i][1] - centerY) * (_data[i].score / 100.0)      ]);    }    console.log("newCoverPoints ",_coverPoints)    _context.beginPath();    _context.fillStyle = 'rgba(90,200,250,0.4)';    _context.moveTo(_coverPoints[5][0],_coverPoints[5][1]); //5    for (var j = 0; j < 6; j++) {      _context.lineTo(_coverPoints[j][0],_coverPoints[j][1]);    }    _context.stroke();    _context.closePath();    _context.fill();  }
  function drawPoints(pointRadius) {    _context.fillStyle = _color;    for (let i = 0; i < _coverPoints.length; i++) {      _context.beginPath();      _context.arc(_coverPoints[i][0],_coverPoints[i][1],pointRadius,0,Math.PI*2);      _context.closePath();      _context.fill();    }  }

3.4 最后来绘制文本

绘制文本也是用的最外围的 6 个顶点的坐标。而用的 API 是 fillText(text,x,y),其中 x,y 代码文字绘制起点,但注意,不是文字所在矩形框的左上角,应该在左下角的大概位置。准确来说是文字的基线位置,这个在其他的GUI系统中也是一样,当然这里不追求那么细节了,就认为是左下角位置吧。

因此,对于不同侧的文字,其起点坐标也是不一样。如左侧的文字至少应该是左侧的顶点 x 减去文字的宽度。再比如,上下两侧的文字与顶点中相对居中对齐的,因此计算方法是 x 减去文字宽度的一半。代码的实现分为了上下左右来进行不同的绘制。

代码如下,看着有点长,但其实是很简单的。

  function drawUpText(item, pos) {    let nameMeasure = _context.measureText(item.name);    let scoreMeasure = _context.measureText(item.score);    _context.fillStyle = '#8E8E8E';    _context.fillText(item.name, pos[0] - nameMeasure.width / 2,pos[1] - 26);    _context.fillStyle = '#212121';    _context.fillText(item.score, pos[0] - scoreMeasure.width / 2,pos[1] - 10);  }
  function drawDownText(item, pos) {    let nameMeasure = _context.measureText(item.name);    let scoreMeasure = _context.measureText(item.score);    _context.fillStyle = '#8E8E8E';    _context.fillText(item.name, pos[0] - nameMeasure.width / 2,pos[1] + 16);    _context.fillStyle = '#212121';    _context.fillText(item.score, pos[0] - scoreMeasure.width / 2,pos[1] + 32);  }
  function drawLeftText(item, pos) {    let nameMeasure = _context.measureText(item.name);    let scoreMeasure = _context.measureText(item.score);    _context.fillStyle = '#8E8E8E';    _context.fillText(item.name, pos[0] - nameMeasure.width - 10,pos[1]);    _context.fillStyle = '#212121';    _context.fillText(item.score, pos[0] - 10 - (nameMeasure.width + scoreMeasure.width) / 2,pos[1] + 16);  }
  function drawRightText(item, pos) {    let nameMeasure = _context.measureText(item.name);    let scoreMeasure = _context.measureText(item.score);    _context.fillStyle = '#8E8E8E';    _context.fillText(item.name, pos[0] - nameMeasure.width + 26,pos[1]);    _context.fillStyle = '#212121';    _context.fillText(item.score, pos[0] + 26 - (nameMeasure.width + scoreMeasure.width) / 2,pos[1] + 16);  }
  function drawText() {    _context.fillStyle = '#8E8E8E';    _context.strokeStyle = _color;    let textPos = _allPoints[0];    for (let i = 0; i < textPos.length; i++) {      let item = _data[i];      let pos = textPos[i];      if(i == 0) {        drawUpText(item, pos);      } else if(i == 1 || i == 2) {        drawRightText(item, pos);      } else if(i == 3) {        drawDownText(item, pos);      } else if(i == 4 || i == 5) {        drawLeftText(item, pos);      }    }  }

关于“Canvas如何实现一个六边形能力图”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Canvas如何实现一个六边形能力图

本文链接: https://www.lsjlt.com/news/257861.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Canvas如何实现一个六边形能力图
    这篇文章将为大家详细讲解有关Canvas如何实现一个六边形能力图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言六边形能力图如下,由 6 个 六边形组成,每一个顶点代表其在某一方面的能力。这篇文章我...
    99+
    2023-06-09
  • css如何实现六边形图片
    小编给大家分享一下css如何实现六边形图片,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先上效果: 用简单的div配合伪元素,即可&lsquo;画出&rsquo;这幅六边形图片,原理是三个相同宽高...
    99+
    2023-06-08
  • css如何实现六边形
    小编给大家分享一下css如何实现六边形,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! css实现六边...
    99+
    2024-04-02
  • 使用css3怎么实现一个六边形边框
    使用css3怎么实现一个六边形边框?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现代码:HTML代码<div class="boxF...
    99+
    2023-06-08
  • WPF如何实现能自由改变形状的四边形和六边形
    本文小编为大家详细介绍“WPF如何实现能自由改变形状的四边形和六边形”,内容详细,步骤清晰,细节处理妥当,希望这篇“WPF如何实现能自由改变形状的四边形和六边形”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果图...
    99+
    2023-07-05
  • 如何用JavaScript Canvas绘制六边形网格
    这篇“如何用JavaScript Canvas绘制六边形网格”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用J...
    99+
    2023-06-26
  • 使用Canvas如何绘制一个多边形
    使用Canvas如何绘制一个多边形?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。function drawPolygonPath(sideNum,&n...
    99+
    2023-06-09
  • WPF实现能自由改变形状的四边形和六边形
    效果图 实现步骤 程序的C#部分,使用简单的三角函数实现正六边形的确定 using System; using System.Collections.Generic; using ...
    99+
    2023-03-09
    WPF实现四边形 六边形 WPF四边形 WPF六边形
  • CSS怎样实现蜂巢/六边形图集
    这篇文章将为大家详细讲解有关CSS怎样实现蜂巢/六边形图集,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、实现六边形首先用传统的方式来分析一下六边形可以拆分成三个矩形,每个矩形 旋转正负 60&...
    99+
    2023-06-08
  • css如何设置图片为六边形
    这篇“css如何设置图片为六边形”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“css如何设置图片为六边形”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入主题...
    99+
    2023-06-06
  • 使用canvas怎么实现一个图形验证码功能
    本篇文章给大家分享的是有关使用canvas怎么实现一个图形验证码功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。<!DOCTYPE html><h...
    99+
    2023-06-09
  • HTML5 Canvas如何实现图形叠加
    这篇文章将为大家详细讲解有关HTML5 Canvas如何实现图形叠加,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在Canvas中有12个组合类型,这些类型用属性gl...
    99+
    2024-04-02
  • 怎么在H5中使用canvas实现一个动态图形功能
    怎么在H5中使用canvas实现一个动态图形功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是动画?我们在绘制动画之前必须要弄清楚什么是动画,一个动画最起码需要哪些基...
    99+
    2023-06-09
  • css如何实现图形化边界
    这篇文章给大家分享的是有关css如何实现图形化边界的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图形化边界  顾名思义,图形化边界就是允许使用图片作为对象的边界,语法如下:  border: 5px&n...
    99+
    2023-06-27
  • CSS怎么实现图片背景填充的六边形
    小编给大家分享一下CSS怎么实现图片背景填充的六边形,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!六边形的实现原理其实就是通过旋转三个重叠的矩形得到的,如下图所示...
    99+
    2023-06-08
  • js如何实现一个Canvas统计图插件
    小编给大家分享一下js如何实现一个Canvas统计图插件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先说下实现的功能吧:  1...
    99+
    2024-04-02
  • Canvas入门实战之怎么实现一个图形验证码
    这篇文章主要介绍“Canvas入门实战之怎么实现一个图形验证码”,在日常操作中,相信很多人在Canvas入门实战之怎么实现一个图形验证码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • 使用canvas怎么实现一个拼图功能
    使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后...
    99+
    2023-06-09
  • css如何实现六边钻石
    小编给大家分享一下css如何实现六边钻石,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!钻石#cut-diamond {...
    99+
    2024-04-02
  • 怎么使用CSS实现酷炫六边形网格背景图
    本文小编为大家详细介绍“怎么使用CSS实现酷炫六边形网格背景图”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用CSS实现酷炫六边形网格背景图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如何绘制六边形?首...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作