我正在构建一个小型应用程序,该应用程序将获取用户设备的经/纬度位置以及航向(正北),并告诉您用户面前有哪些兴趣点。我正在从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
这是判断事情是否摆在眼前的好方法吗?还是我应该考虑做些不同的事情?
答案 0 :(得分:1)
是的,点积是解决此问题的一种好方法,但是我在您的方程式/代码中看不到任何点积,我只在那儿弄得乱七八糟。
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)