gpt4 book ai didi

javascript - 具有多个路径的 Canvas isPointInPath()

转载 作者:搜寻专家 更新时间:2023-10-31 22:06:16 24 4
gpt4 key购买 nike

我有一个名为 Box 的 Canvas “对象”,我需要检测鼠标何时悬停在上面。

我有一个用于此对象的 draw() 方法,我使用 isPointInPath() 方法,但仅当光标位于最后一条路径时才更改。有什么建议吗?

Box.prototype.draw = function() {

this.ctx.beginPath();
this.ctx.moveTo(this.matrix.p1.x, this.matrix.p1.y);
this.ctx.lineTo(this.matrix.p2.x, this.matrix.p2.y);
this.ctx.lineTo(this.matrix.p3.x, this.matrix.p3.y);
this.ctx.lineTo(this.matrix.p4.x, this.matrix.p4.y);
this.ctx.lineTo(this.matrix.p1.x, this.matrix.p1.y);
this.ctx.closePath();

this.ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';
this.ctx.fill();

if (this.ctx.isPointInPath(mouse.x, mouse.y)) {
this.canvas.style.cursor = 'pointer';
this.ctx.fillStyle = 'rgba(0, 0, 255, 0.5)';
this.ctx.fill();
return;
}

this.canvas.style.cursor = 'default';

};

最佳答案

您可以将每个路径存储在一个数组或对象中,以便稍后访问它们。

通常您需要创建一个Path2D。 (使用前检查浏览器支持)。

这是一个非常简单的六边形网格来证明这一点: http://codepen.io/pixelass/pen/37445407893ef783e414ce136af5633a

const C = document.createElement('canvas');
const $ = C.getContext('2d');

const rows = 5;
const cols = 5;
var side = 50;
C.width = cols * side * Math.sqrt(3);
C.height = rows * 1.5 * side;

const paths = [];

var dy = -1;
for (let i = 0; i < (rows + 1) * (cols + 1); i++) {
let dx = i % (cols + 1);
dy += dx ? 0 : 1;
dx += dy % 2 ? -.5 : 0;
let cx = dx * (side * Math.sqrt(3)) + side / 2 * Math.sqrt(3);
let cy = (dy - .5) * (side * 1.5) + side;
let path = new Path2D();
for (let j = 0; j < 6; j++) {
let x = Math.cos(Math.PI / 3 * j + Math.PI / 6) * side + cx;
let y = Math.sin(Math.PI / 3 * j + Math.PI / 6) * side + cy;
if (j) {
path.lineTo(x, y);
} else {
path.moveTo(x, y);
}
}
path.closePath();
$.fillStyle = `hsl(${10*i},50%,50%)`;
$.fill(path);
paths.push(path);
}

C.addEventListener('mousemove', e => {
let bound = C.getBoundingClientRect();
let x = e.pageX - bound.left;
let y = e.pageY - bound.top;
paths.forEach((path, index) => {
if ($.isPointInPath(path, x, y)) {
console.log(index);
}
});
});

document.body.appendChild(C);

关于javascript - 具有多个路径的 Canvas isPointInPath(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27850703/

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