Calcul de l'angle entre deux vectors?

Je développe une application iOS, qui doit montrer des POI (points d'intérêt) en fonction du titre de l'appareil. J'ai utilisé CLLocationManager pour get l'location et le titre de l'user. J'ai une paire de coordonnées de destination. Sur cette base, je calcule quel est le quart et renvoie la valeur flottante de l'écart par rapport au sud (0 degré) en degrés. J'ai – / + 180 degrés au nord et 0 au sud. Voici un extrait de code:

 -(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 ; } 

D'une manière ou d'une autre, j'ai une situation, quand la cible est au quasortingème sortingmestre, mais est à -93 degrés du sud. Je suis perdu et je n'ai aucune idée de comment réparer ça …

edit: par quart je veux dire système de coordonnées cartésien, où + y est au nord, + x est et ainsi de suite!

ps: J'ai lu que la boussole de l'iPhone est vraiment mauvaise, mais si oui, comment l'application comme Google Maps fonctionne correctement?

edit2 : J'ai fait une erreur avec des angles. Officiellement o -90 degrés à l'est et 90 à l'ouest.

Si je le vois correctement, la formule

 angle = atan2(x, -y) * 180.0/M_PI; 

devrait fonctionner dans tous les quadrants, rendant toutes les déclarations if inutiles.


atan2(y, x) renvoie l'angle entre le vector (x, y) et l'axe x positif, la valeur de return est toujours comprise entre -pi et pi .

Remplacer (y, x) par (x, -y) dans les arguments signifie que le vector est tourné de 90 degrés, donc le résultat de la formule ci-dessus est l'angle mesuré à l'axe y négatif, ce qui est ce que vous vouliez.


Mise à jour (selon "edit2" dans la question): Si l'exigence est "sud = 0 deg", "est = -90 deg", "ouest = +90 deg" alors la formule serait

 angle = atan2(-x, -y) * 180.0/M_PI; 

La fonction atan2 prend déjà en count le quadrant. En d'autres termes, il "sait" que vous êtes dans le troisième quadrant si les deux x et y sont négatifs. Sachant cela, vous pouvez voir ce que l'angle de sortie pour atan2(y, x) est, puis le changer à la façon dont vous voulez l'afficher.

La principale raison pour laquelle Google Maps fonctionne même avec une boussole relativement inexacte est que les structures des routes vous donnent des indices, de sorte que vous pouvez vous en sortir avec une erreur plus grande que si vous ne saviez pas où les routes étaient.

En fait, après avoir décidé du quadrant, j'ai changé le code pour toujours calculer atan2 avec des valeurs positives de x et y – maintenant ça marche!