3 votes

Faire pivoter un objet dans le système de coordonnées LatLng

J'essaie de faire pivoter une ligne autour de son propre centre dans le système de coordonnées.

J'ai l'angle et les deux points. J'ai donc essayé d'ajouter la matrice de rotation, comme ceci (la méthode suivante prend la latitude et la longitude d'un point et l'angle) :

 LatLng rotate(double lat, double long, double angle){
   double rad = angle*pi/180;
   double newLong = long*cos(rad)-lat*sin(rad);
   double newLat = long* sin(rad) + lat*cos(rad);

  return LatLng(newLat,newLong);

  }

Par exemple, j'ai obtenu le point A (latitude:x,longitude:y) et le point B(latitude:x,longitude:y). En reliant ces deux points, on obtient une ligne. Maintenant je veux faire tourner la ligne autour de son propre centre avec la méthode ci-dessus, en appelant :

LatLng newA = rotate(A.latitude,A.longitude);
LatLng newB = rotate(B.latitude,B.longitude);

Mais lorsque je connecte les deux points newA et newB, il n'y a pas l'effet désiré.

Comme @Abion47 l'a précisé dans sa réponse, j'ai besoin d'une rotation en 3 dimensions, mais comment faire ? Et est-ce possible en 2 dimensions s'il s'agit d'une très petite ligne ?

4voto

Abion47 Points 6101

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 :

Formula results on Google Maps

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X