我想找到一种方法来知道我是否点击一行。我有一个标准的二维平面图,例如正方形,两者之间有一条直线。我想要检测何时点击该行。 该线可以是水平的,垂直的或有角度的。 我有上线的那些信息:检测点击一行
-Starting坐标(X,Y)
-Ending坐标(X,Y)
-The鼠标点击位置(x,y)的
我可能可以用tan()获得角度。 我找到了这个解决方案,但是我不能添加鼠标事件:How to select a line
谢谢你。
我想找到一种方法来知道我是否点击一行。我有一个标准的二维平面图,例如正方形,两者之间有一条直线。我想要检测何时点击该行。 该线可以是水平的,垂直的或有角度的。 我有上线的那些信息:检测点击一行
-Starting坐标(X,Y)
-Ending坐标(X,Y)
-The鼠标点击位置(x,y)的
我可能可以用tan()获得角度。 我找到了这个解决方案,但是我不能添加鼠标事件:How to select a line
谢谢你。
让S
和E
为段端点和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)告诉我是否点击该行。我怎么能容忍这个?这很有趣。 – ILoveWaffle 2014-11-25 01:53:43
比较斜坡有两个缺点:1.它适用于无限长线条,不适用于线段,2.当您离开P1时,宽度越来越大。 – 2014-11-25 07:38:09
看一看这个答案:
Shortest distance between a point and a line segment
他们计算到段从点的最短距离。
已经计算出这个值,你可以接受或拒绝的鼠标点击事件:
if (distanceToSegment(...) < threshold && mouseClicked()) {
// insert code here
}
阈值将取决于你想要如何精确的用户可以。
如果我将线和鼠标点的终点与线的角度相同,是否意味着即时点击该线? – ILoveWaffle 2014-11-24 19:02:00
我认为区分线条和细分是很重要的。你所说的是对一条线而言是正确的,但对一个线段来说却是正确的。您可以在细分受众群之外点击。您需要检查点是否也处于相同的X区间 – purpletentacle 2014-11-24 19:06:22
现在请记住,分辨率可能会非常高,您要为用户提供一定的误差余量。这就是计算距离可以得心应手并且会产生更可靠的方法的原因。 – purpletentacle 2014-11-24 19:08:16
尚未测试,我不知道它是否有帮助。 – ILoveWaffle 2014-11-24 20:46:31