我正在编写一个简单的应用程序,可以向您显示您周围的朋友,但不在法线图中,而是在像UI这样的真正圆形雷达上显示:
(http://i.imgur.com/9Epw0Xh.png)
像这样,我在每个用户处都有纬度,经度,当然我自己是中心。
我还测量每个用户放置他们的距离,因此我知道的数据是他们的纬度,经度和与我的距离。
出于数学原因,我们假设雷达的半径为100像素,我可以使用左侧或右侧位置将其与我之间的距离隔开,但是就顶部或底部而言,它会变得有些棘手,因为我尝试转换其纬度-纬度转换成百分比结果,然后将其放到雷达中……但是我认为也许有更好的方法可以将极坐标系指向笛卡尔坐标系,但是我确实有点头绪。
是否有使用这些类型的接口或周围实现的任何东西的最佳方法?
最佳答案
将所有点的长整数转换为笛卡尔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矢量。它们必须彼此垂直,并指向从雷达原点(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变换矩阵和数学之间的图像差异
将所有点转换为雷达坐标系
只需将所有点乘以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_range
是RADAR最大圆圈代表的最大距离[m]之后,只需将点绘制到雷达(交换
x,y
,因为我将X
用作北,而不是Y
),则也可以丢弃所有距离较远然后距离的点。您也可以通过向垂直轴添加Z
坐标(或绘制L线)来添加3D RADAR(如旧版Elite)希望它能有所帮助并且不会造成太多混乱...