Alors voilà le hic. Le problème que j'ai mentionné précédemment est qu'une paire de latitude-longitude est une paire d'angles, et non un vecteur 2D d'un point sur un graphique, donc essayer de les utiliser pour faire tourner un point dans un espace 3D sur la surface d'une sphère va rencontrer ses propres problèmes. Cependant, tant que vous ne choisissez pas de points qui traversent la ligne internationale de changement de date ou les pôles, vous pouvez toujours utiliser cette astuce en faisant comme si la paire d'angles était un vecteur 2D.
Le vrai problème est que vous voulez faire pivoter les points autour du point médian, mais vos mathématiques ne font qu'effectuer une rotation droite qui les fera pivoter autour de l'origine à la place (c.-à-d. 0,0
). Vous devez décaler vos "points" par rapport au point que vous utilisez comme référence.
import 'dart:math';
LatLng rotate(LatLng coord, LatLng midpoint, double angle) {
// Make this constant so it doesn't have to be repeatedly recalculated
const piDiv180 = pi / 180;
// Convert the input angle to radians
final r = angle * piDiv180;
// Create local variables using appropriate nomenclature
final x = coord.longitude;
final y = coord.latitude;
final mx = midpoint.longitude;
final my = midpoint.latitude;
// Offset input point by the midpoint so the midpoint becomes the origin
final ox = x - mx;
final oy = y - my;
// Cache trig results because trig is expensive
final cosr = cos(r);
final sinr = sin(r);
// Perform rotation
final dx = ox * cosr - oy * sinr;
final dy = ox * sinr + oy * cosr;
// Undo the offset
return LatLng(dy + my, dx + mx);
}
En utilisant cette approche, j'ai obtenu les résultats suivants :
Les points bleus sont l'entrée, le point vert est le point médian calculé et les points rouges sont chacun des points bleus soumis à une rotation de 90 degrés.
(Notez que la distance entre les points bleus semble être plus grande que la distance entre les points rouges. Ceci est dû au fait que j'ai visualisé les résultats dans Google Maps qui utilise la projection de Mercator, ce qui a eu pour effet de modifier l'emplacement des points les uns par rapport aux autres. Si vous deviez visualiser ceci sur un globe terrestre, les points devraient apparaître à la distance correcte les uns des autres).