2014-11-24 41 views
0

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

-Starting坐标(X,Y)

-Ending坐标(X,Y)

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

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

谢谢你。

+0

尚未测试,我不知道它是否有帮助。 – ILoveWaffle 2014-11-24 20:46:31

回答

0

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²

+0

我做了那样的事情。 让我们取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)告诉我是否点击该行。我怎么能容忍这个?这很有趣。 – ILoveWaffle 2014-11-25 01:53:43

+0

比较斜坡有两个缺点:1.它适用于无限长线条,不适用于线段,2.当您离开P1时,宽度越来越大。 – 2014-11-25 07:38:09

0

看一看这个答案:

Shortest distance between a point and a line segment

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

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

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

阈值将取决于你想要如何精确的用户可以。

+0

如果我将线和鼠标点的终点与线的角度相同,是否意味着即时点击该线? – ILoveWaffle 2014-11-24 19:02:00

+0

我认为区分线条和细分是很重要的。你所说的是对一条线而言是正确的,但对一个线段来说却是正确的。您可以在细分受众群之外点击。您需要检查点是否也处于相同的X区间 – purpletentacle 2014-11-24 19:06:22

+1

现在请记住,分辨率可能会非常高,您要为用户提供一定的误差余量。这就是计算距离可以得心应手并且会产生更可靠的方法的原因。 – purpletentacle 2014-11-24 19:08:16