我正在编写一个简单的应用程序,可以向您显示您周围的朋友,但不在法线图中,而是在像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)




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

10-06 06:50