Проверка, если точка впереди - PullRequest
       34

Проверка, если точка впереди

0 голосов
/ 22 сентября 2018

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

Это хороший подход для выяснения, если что-то впереди, или я должен заняться чем-тоотличается?

1 Ответ

0 голосов
/ 23 сентября 2018

Да, точечное произведение - хороший подход для этого, но я не вижу ни одного точечного произведения в ваших уравнениях / коде. Я вижу только испорченную тарабарщину ... Если я правильно понял:

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)
...