我正在使用坐标数组在画布上绘制一系列点。检查鼠标光标是否在坐标数组范围内
var points = [[102, 267], [254, 163], [343, 318], [522, 112], [610, 163], [681, 112]];
var canvas = document.getElementById('graph');
var c = canvas.getContext('2d');
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
function drawPoints(){
for (i = 0; i < points.length; i++) {
c.beginPath();
c.arc(points[i][0], points[i][1], 5, 0, 2 * Math.PI, true);
c.fillStyle = "black";
c.fill();
}
}
drawPoints();
我想写一个函数来识别这些点,并将它们标记为鼠标悬停在画布上。
canvas.addEventListener('mousemove', function(evt) {
var mousePos = getMousePos(canvas, evt);
var currMouseX = mousePos.x;
var currMouseY = mousePos.y;
for (i = 0; i < points.length; i++){
if ((points[i][0] >= currMouseX-4 && points[i][0] <= currMouseX+4) && (points[i][1] >= currMouseY-4 && points[i][1] <= currMouseY+4)) {
console.log('in range of '+points[i]);
c.beginPath();
c.arc(points[i][0], points[i][1], 8, 0, 2 * Math.PI, true);
c.fillStyle = "red";
c.fill();
}
}
});
我遇到的问题是我想在鼠标光标离开点的范围时删除标记。
如果我在最后设置了一条简单的else
语句,则循环仅适用于数组中的最后一个点,因为for循环的其余部分仍然执行。我需要检查点是否已经命中,停止for循环,检查鼠标是否离开了点的范围,如果是,清除画布并重新绘制点。
也许一个循环不是处理这个问题的最好方法,也许针/干草堆aproach会更好地工作,但我不知道如何实现这个时,搜索范围而不是嵌套数组内的单个值。
听起来是资源密集的 – timo
这是,请注意,我刚刚更新了我的答案。 –
但它不是计算机上的资源密集型。你有这种循环运行每个HTML/JS游戏,他们这样做很好。 –