我正在编写一个简单的应用程序,可以向您显示周围的朋友,但不是在普通地图中,而是在像UI这样的真正循环雷达上:
(http://i.imgur.com/9Epw0Xh.png)
像这样,我有每个用户的纬度,经度,当然我自己也是中心。
我还测量每个用户定位它们的距离,以便我知道的数据是它们的纬度,经度和距离。
由于数学原因,让我们说雷达是100像素半径,我可以使用左或右定位将它们与我的距离保持距离,但就顶部或底部来说,它会变得更加棘手,因为我尝试将他们的纬度 - 我的纬度转换为百分比结果,然后将它们放在雷达上...但我认为极地到笛卡尔坐标可能有更好的方法,但我真的有点无能为力。
对于这些类型的接口或在那里实现的任何东西,是否有最好的方法?
答案 0 :(得分:6)
将所有点的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
飞机是赤道
如果您想要更精确地处理地球作为椭球而不是球体
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本地笛卡尔坐标系
基本上,您需要获取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
将所有点转换为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 = RADAR_radius/RADAR_range;
RADAR_radius
是屏幕上 RADAR 的大小(以像素为单位)或坐标单位RADAR_range
是 RADAR 最大圆圈代表的最大距离[m] 之后只需将点画到 RADAR (交换x,y
,因为我使用X
作为北而不是Y
)并且您也可以丢弃所有点距离范围更远。此外,您可以通过向垂直轴添加Z
坐标(或绘制L线)来添加类似于旧Elite中的3D RADAR
希望它有所帮助,并没有太多令人困惑......