Ios 检查点是否在前面

Ios 检查点是否在前面,ios,swift,algorithm,2d,point,Ios,Swift,Algorithm,2d,Point,我正在构建一个小应用程序,它获取用户设备的横向/纵向位置以及航向(正北),并告诉您用户面前有什么样的兴趣点。我所有的兴趣点都来自谷歌地图api 我认为最简单的方法是在前向向量和AB向量之间进行点积计算,但是我有一些误报 这是我的密码: func isFront(_ p1 : Point, _ p2 : Point, _ p1Heading : Double) -> Bool { let forward = Point(cos(p1Heading), sin(p1Heading))

我正在构建一个小应用程序,它获取用户设备的横向/纵向位置以及航向(正北),并告诉您用户面前有什么样的兴趣点。我所有的兴趣点都来自谷歌地图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

关注点(lat/lng):42.359980,-71.060303


这是一个很好的方法来判断事情是否在前面,或者我应该考虑做一些不同的事情吗?

是的,点积是一个很好的方法,但是我在你的方程式/代码中没有看到任何点积,我只看到了混乱的胡言乱语。。。如果我做对了:

p1
是设备位置
前进
是前进方向
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)