弄清楚点是否在形状内

时间:2018-03-15 06:46:10

标签: javascript canvas grid

我在javascript和html画布上攻击矢量汽车游戏。 关键是你点击蓝色方块然后汽车去那里 - 简单!

外边框和内边框是我在画布上画出的两个xy点阵列

我已经到了需要弄清汽车是否在航线上的地步。

我尝试了很多不同的东西,但却无法让它发挥作用。它的对角线让我头疼。

有人能指出我正确的方向我将如何做到这一点? 您不需要发布任何代码,只需要了解采用哪种方法以及如何计算的指导原则。

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用CanvasRenderingContext2D#isPointInPath()检查Point是否在轨道上。

https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInPath

为此,您可能需要以某种方式重构代码,以便将轨道绘制为单独的路径。此外,必须在绘制路径之后和绘制任何furthor路径之前调用isPointInPath(),因为isPointInPath()应用于状态堆栈上的当前路径。

答案 1 :(得分:1)

您可以将Path2D对象与偶数填充规则和isPointInPath()结合使用。这允许您定义测试路径一次,而不必担心您在主上下文中绘制的内容。如果您的路径更改只是相应地重新定义路径对象。

首先在路径对象(而不是上下文)上定义两个路径。使用moveTo()将它们分隔为第二条路径。如果您计划中风,您可能也想使用closePath()(对于测试,这将是隐含的)。

使用路径和偶数填充规则进行测试:

if (ctx.isPointInPath(path, x, y, "evenodd")) { /* inside */ };



var ctx = c.getContext("2d");
var path = new Path2D();
path.arc(75, 75, 74, 0, 6.28);  // replace with the polygons
path.closePath();
path.moveTo(75 + 40, 75);
path.arc(75, 75, 40, 0, 6.28);
path.closePath();

ctx.stroke(path);
ctx.globalCompositeOperation = "copy";

window.onmousemove = function(e) {
  ctx.strokeStyle = ctx.isPointInPath(path, e.clientX, e.clientY, "evenodd") ? "red" : "#000";
  ctx.stroke(path);
};

html, body {margin:0}

<canvas id=c></canvas>
&#13;
&#13;
&#13;

相关问题