ios - 检查点是否在前面

标签 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

这是确定事情是否在前面的好方法,还是我应该考虑做一些不同的事情?

最佳答案

是的,点积是一个很好的方法,但我在你的方程式/代码中没有看到任何点积,我只看到那里乱七八糟的乱码......如果我做对了:

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/

相关文章:

ios - 为什么不能在 Swift 中为 @IBOutlet 分配 let 而不是 var?

swift - 使用 swift 将工具栏按钮移至工具栏左侧

ios - 嵌套 NSArray 的 UITableView 中的不同部分标题

iOS 导出为临时错误 : Failed to locate or generate signing assets

ios - 如何将 executeFetchRequest 结果附加到数组结构中

swift - 配置文件 "Developer profile"不包括签名证书 "iPhone Distribution": person's name(key number)

database - 应该从数据库中检查重复项还是捕获异常?

C++11 STL 队列 emplace(Args&&... args) 和 swap(queue& x)

algorithm - 径向网格搜索算法

ios - 我们如何编写带有完成处理程序的 Objective C/Swift 用户定义方法