我正在构建一个小型应用程序,它获取用户设备的纬度/经度位置以及航向(真北),并告诉您用户面前的兴趣点类型。我正在从 google maps api 获取我所有的兴趣点。
我认为最简单的方法是计算前向向量和 AB 向量之间的点积,但是我有一些误报。
这是我的代码:
func isFront(_ p1 : Point, _ p2 : Point, _ p1Heading : Double) -> Bool {
let forward = Point(cos(p1Heading), sin(p1Heading))
let AB = Point(p2.x - p1.x, p2.y - p1.y)
let lenAB = (AB.x * AB.x + AB.y * AB.y).squareRoot()
let normalAB = Point(AB.x / lenAB, AB.y / lenAB)
let dot = (normalAB.x * forward.x + normalAB.y * forward.y)
return (dot > 0)
}
所以一些回归真实但我认为不应该是:
我的位置(纬度/经度):42.359291,-71.059638 航向:173.89306640625
兴趣点(纬度/经度):42.359980,-71.060303
这是确定事情是否在前面的好方法,还是我应该考虑做一些不同的事情?
最佳答案
是的,点积是一个很好的方法,但我在你的方程式/代码中没有看到任何点积,我只看到那里乱七八糟的乱码......如果我做对了:
p1
是设备位置
forward
为前进方向
p2
为测试点
那么应该是:
let forward = Point(cos(p1Heading), sin(p1Heading))
let dot = ((p2.x-p1.x)*forward.x)+((p2.y-p1.y)*forward.y)
return (dot>0.0)
如您所见,不需要任何长度。也不正常(即使你的正常不是正常而是一些乱码)。我认为你应该阅读一些关于向量数学基础的书/教程,并检查这里的东西是如何计算的,你搞砸了 2D 东西:
dot(a,b) = a.x*b.x + a.y*b.y
normal(a) = Point(a.y,-a.x)
关于ios - 检查点是否在前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460705/