iOS компас навигация
Я делаю приложение для iPhone для себя и коллег, чтобы найти наши устройства. Он включает в себя компас, который указывает на север, и стрелку, которая указывает на данную координату устройства.
Однако у меня проблемы с наведением иглы на устройство. Я использую следующий код, чтобы попытаться создать "треугольник" и рассчитать "количество радиан" по заданному северу от компаса, чтобы я мог повернуть стрелку с севера на "величину", смещенную от треугольника C.
triangleA = curLocation.coordinate.latitude - setLocation.coordinate.latitude;
if(triangleA < 0) { east = NO; } else { east = YES; }
triangleB = curLocation.coordinate.longitude - setLocation.coordinate.longitude;
if(triangleB < 0) { north = NO; } else { north = YES; }
float tempC = pow(fabs(triangleA),2) + pow(fabs(triangleB),2);
triangleC = sqrtf(tempC);
Однако треугольник С не содержит радианы между -360 и 360.
Вместе с этим у меня есть еще один вопрос. Есть ли какая-то приватная структура для получения текущего местоположения пользователя? Потому что обычный locationManager имеет довольно большое смещение мин. 5 метров
Я надеюсь, что кто-то может указать мне правильное направление для получения правильных "радианов" с севера.
1 ответ
Вместо использования теоремы Пифагора вы можете использовать триг. Сначала получите разницу между x и y ваших очков
float x = curLocation.coordinate.latitude - setLocation.coordinate.latitude;
float y = curLocation.coordinate.longitude - setLocation.coordinate.longitude;
Затем используйте арктангенс, чтобы получить угол.
float angle = atan2(y,x);
Если вы хотите все положительные значения, добавьте эту строку:
if(angle<0) angle += 2.0*M_PI;
Затем, если вы хотите использовать градусы (0-360) вместо радианов, конвертируйте, используя следующую строку:
angle = angle * (180/M_PI);
И для твоих логических значений. Вы будете указывать на восток, когда угол больше 270° или меньше 90°. Вы будете указывать на север, когда угол между 0 ° и 180°.
east = (angle >= 270) || (angle <= 90);
north = (angle >= 0) && (angle <= 180);