Я создаю небольшое приложение, которое принимает координаты широты / долготы устройства пользователя, а также заголовок (истинный север) и сообщает вам, какие точки интересов находятся перед пользователем.Я получаю все свои точки интереса от API карт Google.
Я подумал, что самый простой способ сделать это - вычисление точечного произведения между моим вектором форварда и вектором 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
Это хороший подход для выяснения, если что-то впереди, или я должен заняться чем-тоотличается?