检查点是否在前面

时间:2018-09-22 20:42:05

标签: ios swift algorithm 2d point

我正在构建一个小型应用程序,该应用程序将获取用户设备的经/纬度位置以及航向(正北),并告诉您用户面前有哪些兴趣点。我正在从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

这是判断事情是否摆在眼前的好方法吗?还是我应该考虑做些不同的事情?

1 个答案:

答案 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)