gpt4 book ai didi

javascript - 事件发生时获取 HTML5 canvas 图形 (Arc) 的尺寸

转载 作者:行者123 更新时间:2023-11-30 11:13:15 26 4
gpt4 key购买 nike

我的问题是:我应该如何做逻辑和数学部分,以便在发出事件时计算每条弧的位置:“点击”、“鼠标悬停”等。

需要考虑的要点:

.线宽

它们是圆线。

以百分比表示的弧长。

.哪个元素在前,ej:z-index位置。

My source code

enter image description here

感谢您的宝贵时间。

最佳答案

有个方便的isPointInStroke()方法,仅此而已。

要考虑 z-index,只需按您绘制的相反顺序检查即可:

const ctx = canvas.getContext('2d');
const centerX = canvas.width/2;
const centerY = canvas.height/2;
const rad = Math.min(centerX, centerY) * 0.75;
const pathes = [
{
a: Math.PI/4,
color: 'white'
},
{
a: Math.PI/1.5,
color: 'cyan'
},
{
a: Math.PI,
color: 'violet'
},
{
a: Math.PI*2,
color: 'gray'
}
];
pathes.forEach(obj => {
const p = new Path2D();
p.arc(centerX, centerY, rad, -Math.PI/2, obj.a-Math.PI/2);
obj.path = p;
});

ctx.lineWidth = 12;
ctx.lineCap = 'round';

function draw() {
ctx.clearRect(0,0,canvas.width,canvas.height);
// since we sorted first => higher z-index
for(let i = pathes.length-1; i>=0; i--) {
let p = pathes[i];
ctx.strokeStyle = p.hovered ? 'green' : p.color;
ctx.stroke(p.path);
};
}
function checkHovering(evt) {
const rect = canvas.getBoundingClientRect();
const x = evt.clientX - rect.left;
const y = evt.clientY - rect.top;
let found = false;
pathes.forEach(obj => {
if(found) {
obj.hovered = false;
}
else {
found = obj.hovered = ctx.isPointInStroke(obj.path, x, y);
}
});
draw();
}

draw();
canvas.onmousemove = canvas.onclick = checkHovering;

canvas{background: lightgray}
<canvas id="canvas"></canvas>

如果您需要 IE 支持,this polyfill应该做的。

关于javascript - 事件发生时获取 HTML5 canvas 图形 (Arc) 的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52731097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com