Con*_*cer 1 c# mapping trigonometry distance
好的,我有一个使用绘图系统绘制线条的应用程序.每条线A,B以纬度/经度格式定义.当用户点击地图时,给我的所有内容都是单点C,用户点击了lat/lon格式.我想让用户通过点击选择地图上的线条.问题是,由于缩放级别不同,用户很难完全沿着这条线点击.我能想到的最好的是它们在我定义的某个阈值距离内点击.如何判断用户是否已点击或合理地接近仅提供此信息的行?
我对算法有一个粗略的想法,但我没有充实它,我不确定它是否是最有效的方法.由于屏幕上可能随时有很多行,因此算法需要相当快.
到目前为止我想出的是首先检查距离AC和BC.如果任一距离大于AB,则用户未单击该行.如果它通过了这个检查,那么我计算角度CAB和CBA.如果C正好在线上,那么两个角度都应该是0,我认为,我的三角形有点生锈.否则,为了确定C是否"足够接近",我将选择两个计算角度中的最小角度,并查看它是否低于某个预定义阈值.
我是在正确的轨道还是离开?有更好的想法吗?
您也可以直接计算点到任意线的距离.在维基百科的文章给你的细节,还有一些(伪)代码.
在您的情况下,您还必须分别考虑终点.即你首先要计算参数t(参见上面的文章)并检查它是否在0到长度的范围内AB.然后,如果另外距离低于预定量,则用户点击该线,否则不点击.
您的案例中的公式如下所示:
(C - (A + t * (B-A))) * (B-A) = 0
=> t = (C.x - A.x) * (B.x - A.x) + (C.y - A.y) * (B.y - A.y) / ((B.x - A.X) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y))
Run Code Online (Sandbox Code Playgroud)
如果t低于0或高于1,则用户未单击该行.否则(即t介于0和1之间)您可以d使用此值计算距离t:
d = dist(C, A+t*(B-A)) = sqrt( (C.x - A.x - t * (B.x - A.x))^2 + (C.y - A.y - t * (B.y - A.y))^2)
Run Code Online (Sandbox Code Playgroud)
如果d低于某个预定义的阈值,您可以假设用户点击了您的行.