下面那种进度条与下面的饼图怎么做? 用canvas怎么画 谢谢

下面那种进度条与下面的饼图怎么做?  用canvas怎么画 谢谢

11132132132123212


回答:

https://codesandbox.io/s/twil...

首先是画饼图

var data = [150, 70];

var radius = 100;

var total = data.reduce((a, b) => a+b, 0);

var cx = 250;

var cy = 250;

var startAngle = -Math.PI/2;

for (var i = 0; i < data.length; i++) {

ctx.fillStyle = i > 0 ? 'skyblue' : 'hotpink';

ctx.beginPath();

ctx.moveTo(cx, cy);

ctx.arc(cx, cy, radius, startAngle,startAngle + (Math.PI * 2 * (data[i] / total)), false);

ctx.lineTo(cx, cy);

ctx.fill();

startAngle += Math.PI * 2 * (data[i] / total);

}

然后外边的弧线同样可以视为一个更大半径圆的一部分,定义一下这条线对应的角度,根据饼图数据,那么这个圆上的3个点的坐标都有了,代码不解释了,都是初中几何

const getPoint  = (angle, radius) => {

angle -= Math.PI/2;

var x = radius * Math.cos(angle);

var y = radius * Math.sin(angle)

return {x:x+cx, y:y+cy}

}

var totalAngle = Math.PI/2;

var percent = data[0]/total;

var r2 = radius+30;

var points = [

getPoint(- totalAngle/2,r2),

getPoint( totalAngle/2, r2),

getPoint(-totalAngle/2 + totalAngle*percent, r2)

]

ctx.beginPath();

ctx.arc(cx, cy, r2, -totalAngle/2-Math.PI/2, totalAngle/2-Math.PI/2, false);

ctx.stroke();

points.forEach(({x, y})=> {

ctx.fillStyle = '#f60';

ctx.beginPath(x, y);

ctx.arc(x, y, 6, 0, Math.PI * 2, false);

ctx.fill();

})


回答:

https://developer.mozilla.org...
看文档自己试着画一下,不要做拿来主义,并不是很复杂的图形


回答:

相近问题 https://segmentfault.com/q/1010000018876242

以上是 下面那种进度条与下面的饼图怎么做? 用canvas怎么画 谢谢 的全部内容, 来源链接: utcz.com/p/936751.html

回到顶部