我正在编写一个简单的应用程序,它可以向您显示您周围的朋友,但不是在法线地图中,而是在像 UI 这样的真正圆形雷达上:
(https://i.stack.imgur.com/Au3IP.png https://i.stack.imgur.com/Au3IP.png)
像这样,我有每个用户的纬度、经度,当然还有我自己的中心。
我还测量每个用户的距离来定位他们,所以我知道的数据是他们的纬度、经度和到我的距离。
出于数学原因,假设雷达的半径为 100 像素,我可以使用左侧或右侧定位将它们与我的距离分开,但就顶部或底部而言,它会变得有点棘手,因为我尝试转换它们的纬度 - 我的纬度转化为百分比结果,然后将它们放在雷达上......但我认为极坐标到笛卡尔坐标可能有更好的方法,但我真的有点无能为力。
对于这些类型的接口或周围实现的任何东西是否有最好的方法?
-
将所有点的长、纬度转换为笛卡尔 3D 空间坐标
它是转换球面 -> 笛卡尔 3D 空间。后面的数学是here http://en.wikipedia.org/wiki/Spherical_coordinate_system。在此之后所有点(long,lat,alt)
将成为(x,y,z)
where (0,0,0)
是 的中心Earth
-
X
轴是lat=0,long=0 [rad]
-
Y
轴是lat=0,long=+PI/2 [rad]
-
Z
轴为北
-
XY
平面是赤道
如果你想要更精准的手柄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)
-
创建 RADAR 局部笛卡尔坐标系
基本上你需要获得 3D 矢量X,Y,Z
轴。它们必须相互垂直并指向正确的方向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 https://stackoverflow.com/a/21100338/2521214构建 4x4 变换矩阵背后的数学原理
-
here https://stackoverflow.com/a/21611264/2521214您可以在图像上看到同质 4x4 和直接 3x3 3D 变换矩阵和数学之间的差异
-
将所有点转换为 RADAR 坐标系
只需将所有点乘以RADAR变换矩阵M
Q(i) = P(i)*M
所以要点Q(i)
现在是本地的RADAR
-
(0,0,0)
表示雷达原点(中心)
-
(1,0,0)
指向北
-
(0,1,0)
指向东
-
(0,0,1)
点向上
所以现在只需将所有坐标乘以RADAR scale
scale = RADAR_radius/RADAR_range;
-
RADAR_radius
是你的尺寸RADAR在屏幕上以像素或坐标为单位
-
RADAR_range
是最大距离RADAR最大的圆代表[m]
之后只需将点画到RADAR (swap x,y
因为我用X
北非Y
)并且您还可以丢弃所有距离比范围更远的点。您还可以添加 3DRADAR就像在旧的精英中一样,添加Z
坐标到垂直轴(或画一条 L 线)
希望它能有所帮助,并且不会太令人困惑......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)