0

我有一个具有一定数学权重的编程问题。我有一张地图,上面有形状(折线)。我可以获取这些形状的屏幕坐标并将它们转换为地图坐标并反转。我正在捕获鼠标位置并在地图上移动。当我移动鼠标时,如何识别我是否靠近地图上淹没的另一个形状。我正在考虑在鼠标光标周围创建一个点半径,然后不断循环通过可用形状(我想我可以将它们的坐标加载到数组中)以进行匹配。但是,我认为这将非常缓慢。关键是当我靠近时(例如 15 像素),我会将缪斯位置捕捉到那个接近的形状。有什么建议么?

4

2 回答 2

1

现在 - 如果你真的想让它变得完美 - 你可以计算光标到每个线段的距离。

对于每个线段(由点 D 和 E 定义)

以格式计算段 DE 的线公式:

斧头 + 通过 + C = 0

A = Dy - Ey

B = Ex - Dx

C = (插入点 D) = -1 * (A * Dx + B * Dy)

现在将光标位置插入公式:

A * cursor.x + B * cursor.y + C = 你到线段的距离

*一件事 - 这是到无界线的距离。您现在要确保您位于两个分段点之间。因此,请确保光标中的角度 D、E 三角形都小于 90 度。有很多方法可以做到这一点,看看点积公式来学习一个快速的方法。

现在,如果 anlges 小于 90,则使用到线的距离,否则,使用到线段的任一点 (D & E) 的最小距离。现在您拥有完整的对齐线功能。

于 2012-09-04T18:13:16.537 回答
0

如果你有形状的每个点/线段(你应该使用折线),这里有一个可能的快速和简单的例程:

对于每个形状,通过平均每个组成点来计算形状中心(即 - 对于五边形,将所有五个 point.x 相加,除以 5 - 对所有 point.y 执行相同操作)。将此称为平均 shape.x 和 shape.y。使用距离公式计算与鼠标的接近程度。(Mouse.x - Shape.x)^2 + (Mouse.y - Shape.y)^2... 您不必取平方根,因为您只对最接近的形状感兴趣。

跟踪每个形状的最小距离“平方”。最小值是您最近的形状中心。

如果您想以最大范围捕捉行为,请确保距离平方 < 像素距离平方。

如果你想让它变得非常高效,形状中心不需要不断地重新计算,只需计算一次。如果您在屏幕空间和您提到的其他坐标之间进行转换,则中心将与任何其他点一样缩放和平移。

于 2012-09-04T17:58:53.963 回答