【问题标题】:Detect click on a line检测点击一行
【发布时间】:2015-01-22 13:51:55
【问题描述】:

我想找到一种方法来知道我是否点击了一条线。我有一个标准的二维平面图,例如正方形,两者之间有一条线。我想检测何时单击该行。 这条线可以是水平的、垂直的或有角度的。 我有这些信息就行了:

-起始坐标(x,y)

-结束坐标(x,y)

-鼠标点击位置(x,y)

我也许可以用 tan() 得到角度。 我找到了这个解决方案,但我无法添加鼠标事件:How to select a line

谢谢。

【问题讨论】:

  • 尚未测试,我不知道它是否有帮助。

标签: java algorithm math graphics mouseevent


【解决方案1】:

SE 为段端点,M 为鼠标。

M 连接到沿SE 的点的向量由MS+t.SE 给出,其中0<t<1

将此向量平方以获得其(平方)长度:d²=SE²t²+2(SE.MS)t+MS²

并找到最小值的位置,t=-(SE.MS)/SE²

如果t<=0,最短距离是到S,因此是d²=MS²

如果t>=1,最短距离是到E,因此是d²=ME²

否则,最短距离是到段上的一点,d²=MS²-(SE.MS)²/SE²

不需要取平方根,因为d<Tolerance 等价于d²<Tolerance²

【讨论】:

  • 我做了类似的事情。让我们取 x,y,x1,y2,x2,y2 - M.X, M.Y, S.X, S.Y., E.X, E.Y. (x - x1) / (x2 - x1) = (y - y1) / (y2 - y1) 告诉我是否点击了这条线。我怎么能容忍这个?这很有趣。
  • 比较斜率有两个缺点:1. 它适用于无限线,而不适用于线段,2. 随着您离开 P1,余量会越来越大。
【解决方案2】:

看看这个答案:

Shortest distance between a point and a line segment

他们计算点到线段的最短距离。

计算完这个值,你可以接受或拒绝鼠标点击事件:

if ( distanceToSegment(...) < threshold && mouseClicked()) {
     // insert code here
}

阈值取决于您希望用户的精确程度。

【讨论】:

  • 如果我取线的终点和鼠标点,并且与线的角度相同,是否意味着我点击了线?
  • 我认为区分线和段很重要。你所说的对一条线是正确的,但对一个段是不正确的。您可能在段外单击。您需要检查该点是否也在同一个 X 区间内
  • 现在还请记住,分辨率可能非常高,您希望给用户一些错误余地。这就是计算距离很方便的原因,并且会产生更可靠的方法。
猜你喜欢
  • 2016-03-28
  • 1970-01-01
  • 2012-06-26
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2021-01-30
  • 2013-06-16
相关资源
最近更新 更多