【问题标题】:Rotate a object in LatLng coordinate system在 LatLng 坐标系中旋转对象
【发布时间】:2021-09-15 04:41:41
【问题描述】:

嘿,我正在尝试在 latlng 系统内围绕它自己的中心旋转一条线。

我得到了角度和两个点。所以我尝试附加旋转矩阵,像这样(以下方法采用点的纬度和经度以及角度):

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

  }

例如,我得到了点 A(纬度:x,经度:y)和点 B(纬度:x,经度:y)。连接这两个点导致一条线。现在我想要两个用上面的方法围绕它自己的中心旋转线,通过调用:

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

但是当我连接两个点 newA 和 NewB 时,并没有想要的效果。

正如@Abion47 在他的回答中澄清的那样,我需要在 3 维中旋转,但如何做到这一点?如果它是一条非常小的线,是否可以使用二维?

【问题讨论】:

  • 好吧,很难知道这段代码在做什么。我们所看到的只是一个可能的圆在某个角度的 x 和 y 坐标。如果您要旋转某些东西,则需要转换这些线的坐标偏移量。您发布的这段代码实际上没有任何意义
  • 您将度数转换为弧度,然后使用度数进行以下计算。在三角函数中将angle 更改为rad
  • 此外,纬度和经度表示三个维度的坐标,这意味着任何任意旋转都需要至少两个旋转标量,除非您所做的只是简单地在一个轴上旋转球体。如果您描述了您实际尝试通过轮换实现的目标,将会有所帮助。
  • 对不起,我试图指定我的问题
  • 最后,纬度和经度本身已经代表角度,因此对它们中的任何一个执行简单的旋转意味着只需将新角度添加到现有的纬度/经度值。

标签: flutter dart coordinates latitude-longitude coordinate-transformation


【解决方案1】:

这就是问题所在。我之前提到的问题是纬度-经度对是一对角度,而不是图形上点的 2D 矢量,因此尝试使用它们在球体表面上旋转 3D 空间中的点将遇到自己的问题。然而,事实证明,只要您不选择跨越国际日期变更线或两极的点,您仍然可以通过假设角度对是 2D 向量来使用此技巧。

真正的问题是您想要围绕中点旋转这些点,但您的数学只是执行一个直线旋转,它将围绕原点旋转它们(即0,0)。你需要用你作为参考的点来抵消你的“点”。

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

使用这种方法,我最终得到了以下结果:

蓝点是输入,绿点是计算的中点,红点是每个蓝点经过 90 度旋转。

(请注意,蓝点之间的距离似乎比红点之间的距离更远。这是因为我在使用墨卡托投影的谷歌地图中可视化了结果,结果与点看起来是相对的。如果您要在地球仪上对此进行可视化,这些点之间的距离应该是正确的。)

【讨论】:

  • 天哪,这是我读过的最好的答案。感谢您的努力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2019-05-08
  • 2019-03-21
  • 2012-02-29
  • 1970-01-01
  • 2021-06-06
  • 2019-04-02
相关资源
最近更新 更多