Cálculo de ângulo entre dois vetores?
Estou desenvolvendo um aplicativo iOS, que precisa mostrar POIs (pontos de interesse) dependendo do cabeçalho do dispositivo. eu useiCLLocationManager
para obter a localização e o rumo do usuário. Eu tenho um par de coordenadas de destino. Com base nisso, estou calculando qual é o trimestre e retornando o valor flutuante do desvio do sul (0 graus) em graus. Eu tenho - / + 180 graus no norte e 0 no sul. Aqui está o trecho de código:
-(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 ;
}
De alguma forma eu tenho situação, quando o alvo está no quarto trimestre, mas é -93 graus do sul. Estou perdido e não tenho ideia de como consertar isso ...
editar: por quarto quero dizer sistema de coordenadas cartesianas, onde + y é norte, + x é leste e assim por diante!
p.s .: Eu li que a bússola do iPhone é muito ruim, mas se sim, como aplicativos como o Google Maps estão funcionando corretamente?
edit2: Eu cometi um erro com ângulos. Oficialmente o -90 graus no leste e 90 no oeste.