在"球面定位"博文中分析的思路经过程序验证是正确的,但根据该思路,要画出球面剖切圆的图形,只能是以经纬坐标的经度为自变量来得到轨迹的纬度来确定轨迹点的.存在如下的问题:
经度以等步长变化时,纬度跟随步长变化有时很不均匀,会出现圆轨迹很不圆滑的情况,即使经度变化步长设的很小,仍然如此.
如图所示:
这是因为当剖切面朝向角较大时,剖切圆经过赤道附近时,轨迹上单位经度的变化带来纬度的变化会很大所致.
为改决该问题,必须建立剖切圆以其圆心角为参变量的参数方程.
因为只有圆心角的变化和弧长变化的关系才是线性均匀的.
如何建立剖切圆以其圆心角为参变量的参数方程呢?
又是一个麻烦的问题.
启发思路:
1.球面网格线的赤道线,实际上就是圆心角以经度变化步长为单位,纬度始终为0画成的剖切圆,经过投影变换,不管从什么角度看,球面线都是均匀的。经球面任意点任意方位角的剖切圆,应该是赤道线的旋转变换的结果。
2.球面网格的经度线,可以看成是以纬度变化步长为单位,经度不变画成的剖切圆,经过投影变换,不管从什么角度看,球面线也都是均匀的。经球面任意点任意方位角的剖切圆,可以看作是将极点旋转变换到该点的旋转变换的结果。
投影变换算法本身就是旋转变换的算法,应该可以用投影变换算法来解决这个问题。
先研究极点变换的思路。
程序使用的球面参数方程是:
MX := R * Cosv * Cosu;
MY := R * Cosu * Sinv;
MZ := R * Sinu;
极点坐标对应:北极NP(0,0,-R)和南极SP(0,0,R),对应经纬坐标是(v,-pai/2)和(v,pai/2).极点的经度v可取0-360任意值。
程序使用的投影变换公式是:
PX := MX * Cos(Cy) + MZ * Sin(Cy);
PY := MX * Sin(Cy)Sin(Cx) + MY * Cos(Cx) - MZ * Cos(Cy)Sin(Cx);
PZ := -MX * Sin(Cy)Cos(Cx) + MY * Sin(Cx) + MZ * Cos(Cy)cos(Cx);
其中,
Cx为视点的仰角,等效是XOZ平面绕Y轴旋转的角度。如果用来做旋转变换,相当于纬度坐标“平移”的一个角度。
Cy为视点的斜角,等效是XOY平面绕Z轴旋转的角度。如果用来做旋转变换,相当于经度坐标“平移”的一个角度。
(MX,MY,MZ)是模型空间坐标;
(PX,PY,PZ)是投影空间坐标;
假设要把球面经纬坐标为(v,u)的任意一点“变换”为新坐标系下的北极点,
也就是说,要在原坐标系下,以(v,u)为北极点画新的经纬网格。
就相当于,要将坐标系旋转变换到北极点为(v,u)的点来。
原北极点是:(vx,-pai/2)
所以,要旋转的角度为:(v-vx,u+pai/2)
这样,新坐标系下的极点(vx,-pai/2)才能对应原坐标系下的任意指定点(v,u)。
利用投影公式,只要设 Cx = u+pai/2, Cy = v-vx
对原模型进行“投影”变换,就等于进行了模型的“旋转”变换。
程序试下,看效果如何?
程序实现:
1.先实现过任意点不变换时画该点的经纬线的方法;该方法可用于绘制球面经纬十字光标,对往后做球面交互作图也很有用。
2.然后将极点变换到该点,画出以该点为变换后的北极点的两个经线圈。
编程中...
程序编写完成
思路基本正确,只是真正需要旋转的角度和上述想像不同。
而是:
Cy := -arcsin(MX/R)
Cx := arcsin(MY/(R*cos(Cy));
到此,球面定位程序编写基本成功。界面如下:
其中白色圈线为球面经纬十字光标,可随鼠标移动而移动,是个令人有小兴奋新意之感的特性。
定位标记点A设置了两个定位标记圈,定位标记圈的角度分别为东偏北30度和北偏东30度。
定位标记点可任意设置,在每个定位标记点上最多可设置10个定位标记圈。定位标记圈以正东方向为0度,输入0-360度为方位角,程序换算为正东南西北偏向角。定位标记圈颜色、线宽、偏向角度可在列表框中选中右键设置。
执行程序下载如下:
https://blog.sciencenet.cn/blog-33982-594338.html
上一篇:
球面定位问题下一篇:
分析一下沈卫国老师的歌氏猜想的证明思路