代表圆形雷达数学方法的要点

ale*_*tov 1 javascript math maps google-maps

我正在编写一个简单的应用程序,可以向您显示周围的朋友,但不是在普通地图中,而是在像UI这样的真正循环雷达上:

[Imgur](http://i.imgur.com/9Epw0Xh.png)

像这样,我有每个用户的纬度,经度,当然我自己是中心.

我还测量每个用户定位它们的距离,以便我知道的数据是它们的纬度,经度和距离.

由于数学原因,让我们说雷达是100像素的半径,我可以使用左或右定位将它们与我的距离保持距离,但就顶部或底部而言,它会变得更加棘手,因为我试图转换它们的纬度 - 我的纬度为百分比结果然后将它们放在雷达上...但我认为极地到笛卡尔坐标可能有更好的方法,但我真的有点无能为力.

是否有最好的方法与这些类型的接口或周围实现的任何东西?

Spe*_*tre 6

  1. 将所有点的长,纬度转换为笛卡尔3D空间坐标

    它是转换球形 - >笛卡尔3D空间.数学背后就在这里.毕竟这点,(long,lat,alt)将成为(x,y,z)这里(0,0,0)是中心地球

    • X 轴是 lat=0,long=0 [rad]
    • Y 轴是 lat=0,long=+PI/2 [rad]
    • Z 轴是北
    • XY 飞机是赤道

    地球

    如果你想要更精确地处理地球作为椭球而不是球体

    long = <     0 , +2*PI > [rad]
    lat  = < -PI/2 , +PI/2 > [rad]
    alt  = altitude above sea level [m]
    Re =6378141.4; [m]
    Rp =6356755.0; [m]
    
    R=alt+sqrt( (Re*cos(lat))^2 + (Rp*sin(lat))^2 )
    x=R*cos(lat)*cos(long)
    y=R*cos(lat)*sin(long)
    z=R*sin(lat)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建RADAR局部笛卡尔坐标系

    尼

    基本上你需要获得X,Y,Z轴的3D矢量.它们必须彼此垂直并指向RADAR原点的正确方向(P0).

    您可以使用向量乘法,因为它会为其乘法器创建垂直向量.方向取决于乘法器的顺序,因此稍微进行实验.

    //altitude this one is easy
    Z = P0
    //north (chose one that is non zero, resp. bigger to avoid accuracy problems)
    X = (1,0,0) x Z // old X axis * Altitude
    X = (0,1,0) x Z // old Y axis * Altitude
    //east is now also easy
    Y = X x Z 
    // now normalize all of them to unit vectors
    X = X / |X|
    Y = Y / |Y|
    Z = Z / |Z|
    // and check if they are not negative (X,Y)
    // if they are then swap multiplicants or multiply by -1
    // do not forget that X is computed by two methods so swap the correct one
    
    Run Code Online (Sandbox Code Playgroud)
    • 这里是构建4x4变换矩阵的数学
    • 在这里你可以看到同质4x4和直接3x3 3D变换矩阵和数学之间的图像差异
  3. 将所有点转换为RADAR坐标系

    只需将所有点乘以RADAR变换矩阵M

    Q(i) = P(i)*M
    
    Run Code Online (Sandbox Code Playgroud)

    所以积分Q(i)现在是RADAR的本地

    • (0,0,0) 雷达起源(中心)
    • (1,0,0) 指向北方
    • (0,1,0) 指向东方
    • (0,0,1) 指出

    所以现在只需将所有坐标乘以雷达尺度

    scale = RADAR_radius/RADAR_range;
    
    Run Code Online (Sandbox Code Playgroud)
    • RADAR_radius是屏幕上RADAR的大小,以像素为单位或坐标单位
    • RADAR_rangeRADAR最大圆圈代表的最大距离[m]

    之后只需将点画到RADAR(交换,x,y因为我使用的X不是北方Y)而且你也可以丢弃距离范围更远的所有点.您还可以通过向垂直轴添加坐标(或绘制L线)来添加旧的Elite中的3D RADARZ

    3D雷达

希望它有点帮助,并没有太多混乱......