基于Canvas六边形能力图(含动画)-干货满满~拿来就用!

更新时间:2023-07-28 10:13:27 阅读: 评论:0

基于Canvas六边形能⼒图(含动画)-⼲货满满~拿来就⽤!在最近的⼯作中,有⼀个需求需要对个⼈进⾏多维度评分,UI需要我完成⼀个类似游戏中的能⼒六边形的绘制,如图:
看我们如何⼿打⼀点点实现吧。
先贴完整代码:
<!DOCTYPE html>
<html>
<body>四载
<!--定义画布容器,给个边框省的你们找不到-->
<canvas id="myCanvas"width="400"height="400" >
Your browr does not support the HTML5 canvas tag.
乾乾意思是什么</canvas>
<script>
//获取画布对象
var c = ElementById("myCanvas");
var ctx = c.getContext("2d");
//背景及同⼼圆相关参数,
var canvaSide =400,//canvaSide: 画布⼤⼩,从width、height获得
arcMaxR =180,//背景中最⼤同⼼圆的半径
arcNum =5,//同⼼圆的个数
arcOfft = arcMaxR/arcNum,//同⼼圆的半径差
arcXPoint = canvaSide/2,//圆⼼x坐标
arcYPoint = canvaSide/2;//圆⼼y坐标
//六边形相关参数,
var sideL = arcMaxR,//六边形边长(与最⼤同⼼圆半径同长,你们可以⾃⼰算下)
yOfft =(Math.sqrt(3)* sideL)/2,//y坐标的偏移量 cos 30° * 边长
xOfft = sideL /2,//x坐标的偏移量 sin 30° * 边长
startY = canvaSide/2,//定义point1 也就是起始点的坐标X
startX = startY - arcMaxR;//定义point1 也就是起始点的坐标Y
//定义六边形的6个点,点位置如下图所⽰
var pointArray =[
{"id":1,"x": startX,"y": startY },
{"id":2,"x": startX + xOfft,"y": startY + yOfft },
{"id":3,"x": startX + xOfft + sideL,"y": startY + yOfft },
{"id":4,"x": startX +2* xOfft + sideL,"y": startY },
{"id":5,"x": startX + xOfft + sideL,"y": startY - yOfft },
{"id":6,"x": startX + xOfft,"y": startY - yOfft }
];
//留个维度的得分
var socreArray =[
{"id":1,"score":80},
{"id":2,"score":80},
{"id":3,"score":80},
{"id":3,"score":80},
粉蒸肉
{"id":4,"score":80},
{"id":5,"score":80},
{"id":6,"score":100},
]
;
//计算分数以及每次更新的x坐标长度桂花茶的制作
var maxIndex , minIndex;
乘坐电梯安全须知var drawScoreFrames =24;
var drawCount =0;
/*
* 绘制背景图⽚
*/
function drawBG(){
//清空画布
ctx.clearRect(0,0,c.width,c.height);
ctx.beginPath();
//绘制同⼼圆极其背景
for(var i = arcNum; i >=0; i--){
ctx.strokeStyle ="#E5EBEE";
ctx.arc(arcXPoint, arcYPoint, i * arcOfft,0,2* Math.PI);
if(i == arcNum){
ctx.fillStyle ="#F5FAFC";
ctx.fill();
}
}
//绘制连线,画出1-4,2-5,3-6 六边形顶点的连线
for(var i=0;i<3;i++){
var startPoint = pointArray[i],
endPoint = pointArray[i+3];
ctx.strokeStyle ="#E5EBEE";
ctx.lineTo(endPoint.x,endPoint.y);
ctx.stroke();
}
//绘制六边形六个⾓的实⼼圆点
for(var i=0;i<pointArray.length;i++){
var point = pointArray[i];
ctx.strokeStyle ="#2F8BF2";
ctx.fillStyle ="#2F8BF2";
膜龈手术
ctx.beginPath();
ctx.arc(point.x, point.y,4,0,2* Math.PI);
ctx.fill();
ctx.stroke();
}
男士蛋糕}
//计算分数以及每次更新的x坐标长度,主要思路,已固定的圆⼼坐标为参考系,定义到1,2,3,4,5,6点的线段上展⽰分数时每次的变化偏移量//这个变化变异量与维度得分、哪条线段、总共渲染帧数有关
for(var i=0;i<socreArray.length;i++){
var scoreD = socreArray[i],
scoreId = scoreD.id,
scoreVal = scoreD.score;
if(scoreId ==1){
}
if(scoreId ==2){
}
if(scoreId ==3){
if(scoreVal > socreArray[1].score){
maxIndex =2;
}el{
maxIndex =1;
}
}
if(scoreId ==4){
}
if(scoreId ==5){
}
}
if(scoreId ==6){
if(scoreVal > socreArray[4].score){
minIndex =5;
}el{
minIndex =4;
}
}
}
/**
* 动态渲染得分,思路如下
* 1、每次清空上次的BG(同⼼圆)并重新绘制
* 2、根据这是第⼏次渲染,计算圆⼼到1-6个点连线的坐标
* 3、将坐标连接起来渲染成六边形,并定时开始下⼀次渲染实现动画
*/
function dyncDrawSoce(){
if(drawCount>drawScoreFrames){
return;
}
drawBG();
ctx.beginPath();
var grdStartX ,grdStartY,grdEndX,grdEndy;
for(var i=0;i<socreArray.length;i++){
吴其var scoreD = socreArray[i];
if(i ==0){
}el{
if(i == maxIndex){
grdStartX = fft *drawCount;
grdStartY =  fft *drawCount;
}
if(i == minIndex){
grdEndX = fft * drawCount;
grdEndy =  fft * drawCount;
}
ctx.lineTo(fft * drawCount, fft * drawCount);
}
}
ctx.cloPath();
//TODO 这个地⽅绘制六边形
//ctx.fill();
ctx.strokeStyle ='#4C9CF6';
var ateLinearGradient(grdStartX,grdStartY,grdEndX,grdEndy);
grd.addColorStop(1,"rgb(122,190,241,0.4)");
grd.addColorStop(0,"rgb(255,255,255,0.4)");
ctx.fillStyle = grd;
ctx.stroke();
ctx.fill();
drawCount++;
tTimeout("dyncDrawSoce();",500/drawScoreFrames);
}
dyncDrawSoce();
</script>
</body>
</html>

本文发布于:2023-07-28 10:13:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1121597.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:六边形   坐标   渲染   画布   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图