Я разрабатываю приложение iOS, которое должно показывать POI (точки интереса) в зависимости от заголовка устройства. Я использовал CLLocationManager
, чтобы получить местоположение и заголовок пользователя. У меня есть одна пара координат назначения. Исходя из этого, я вычисляю, какой именно квартал, и возвращает значение плавающего отклонения с юга (0 градусов) в градусах. У меня -/+ 180 градусов на севере и 0 на юге. Вот фрагмент кода:Расчет угла между двумя векторами?
-(float)updateTargetLongitude:(float)lon Latitude:(float)lat{
// //longitude = x
// //latitude = y
NSLog(@"current location = (%.5f, %.5f)", [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLongitude"], [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLatitude"]);
float x = lon - [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLongitude"];
float y = lat - [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLatitude"];
float angle;
NSLog(@"Searching angle from source (%.5f, %.5f) to destination (%.5f, %.5f)", locationManager.location.coordinate.longitude, locationManager.location.coordinate.latitude, lon, lat);
if (x == 0 && y == 0) {
NSLog(@"you're there already!");
return -0.1;
}
if(x == 0 && y > 0){
NSLog(@"look north");
angle = 180.0;
}
if (x == 0 && y < 0) {
NSLog(@"look south");
angle = 0;
}
if (x > 0 && y == 0) {
NSLog(@"look east");
angle = 90.0;
}
if (x < 0 && y == 0) {
NSLog(@"look west");
angle = -90;
}
if (x > 0 && y > 0) {
NSLog(@"first quarter");
angle = -atan2f(y, x) - M_PI_2;
}
if (x < 0 && y > 0) {
NSLog(@"second quarter");
angle = atan2f(y, x) + M_PI_2;
}
if (x < 0 && y < 0) {
NSLog(@"third quarter");
angle = atan2f(x, y);
}
if (x > 0 && y < 0) {
NSLog(@"fourth quarter");
angle = -atan2f(x, y);
}
NSLog(@"returning radians angle = %.4f for (%.5f, %.5f) :: degrees = %.3f", angle, y, x, angle * 180/M_PI);
return angle * 180/M_PI ;
}
Как-то у меня есть ситуации, когда цель находится в четвертом квартале, но -93 градусов с юга. Я потерян, и я не знаю, как это исправить ...
Редактировать: по кварталу Я имею в виду декартову систему координат, где + y - север, + x - восток и так далее!
p.s .: Я читал, что компас iPhone действительно плохой, но если это так, как приложение, подобное Google maps, работает правильно?
edit2: Я допустил ошибку с углами. Официально o имеют -90 градусов на востоке и 90 на западе.
Сторона примечания. Тестирование плавающих точек для равенства может не дать вам ожидаемых результатов. – John
Да, но точно глядя на N/S/E/W, точность устройства почти невозможна, поэтому это было строго для «математического» назначения. – raistlin