gpt4 book ai didi

javascript - 在圆形雷达数学方法中表示点

转载 作者:行者123 更新时间:2023-11-30 08:02:33 26 4
gpt4 key购买 nike

我正在编写一个简单的应用程序,它可以向您显示您周围的 friend ,但不是在法线 map 中,而是在像 UI 这样的真正圆形雷达上:

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

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

我还测量每个用户的距离以定位他们,所以我知道的数据是他们到我的纬度、经度和距离。

出于数学原因,假设雷达的半径为 100 像素,我可以使用左侧或右侧定位将它们与我的距离隔开,但就顶部或底部而言,它变得有点棘手,因为我尝试将它们转换为纬度 - 我对百分比结果的纬度,然后将它们放在雷达上......但我认为可能有更好的方法将极坐标转换为笛卡尔坐标,但我真的有点无能为力。

这些类型的接口(interface)或周围实现的任何东西是否有最佳方法?

最佳答案

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

    它是转换球形 -> 笛卡尔 3D 空间。后面的数学是 here 。在此之后所有点 (long,lat,alt) 将变为 (x,y,z) 其中 (0,0,0)地球

    的中心
    • X 轴是 lat=0,long=0 [rad]
    • Y 轴是 lat=0,long=+PI/2 [rad]
    • Z 轴为北
    • XY 平面是赤道

    globe

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

    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)
  2. 创建雷达局部笛卡尔坐标系

    NEH

    基本上,您需要获取 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
    • here 是构建 4x4 变换矩阵背后的数学
    • here 您可以在图像上看到同质 4x4 和直接 3x3 3D 变换矩阵和数学之间的差异
  3. 将所有点转换为雷达坐标系

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

    Q(i) = P(i)*M

    所以点 Q(i) 现在是 RADAR

    的本地点
    • (0,0,0)表示雷达原点(中心)
    • (1,0,0) 指向北方
    • (0,1,0) 指向东方
    • (0,0,1) 向上点

    所以现在只需将所有坐标乘以RADAR比例

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

    在此之后只需将点绘制到 RADAR(交换 x,y 因为我使用 X 作为北方而不是 Y),你也可以丢弃所有比范围更远的点。您还可以像在旧版 Elite 中一样通过向垂直轴添加 Z 坐标(或绘制 L 线)来添加 3D RADAR

    3D RADAR

希望它能有所帮助并且不会造成太多困惑......

关于javascript - 在圆形雷达数学方法中表示点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24382713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com