球面定位程序主体基本写好,目前卡在关键环节:如何根据经纬坐标点以及该点的偏向方位角确定所在圆周的点的坐标。
老虎提出的球面定位问题是想求任意两个球面的大圆(以球心为圆心的圆)的交点。
但确定球面大圆的方法是任意一点和在该点的方位角。
我想了很久,也没有想到怎么根据方位角和经纬坐标算出大圆平面的倾角来。
因为大圆方程是平面和球的交线,要求交线,就首先得求平面。
球面不像平面,沿方位角延伸的圆上的后续点的方位角是变化的,而平面上是保持不变的。
但直观想,经纬坐标和方位角必定决定了一个大圆。
怎么决定的呢?看来我的立体几何还不过关呢?
哪位老师指点一下?
整理一下思路:
1.根据球面点的经纬坐标得到该点的切平面方程,应该可行;
2.在切平面上根据方位角,可求待求大圆的切线方程,应该可行;
3.根据切线方程和球面点和球心的直线方程,可求剖球平面的方程;
4.根据剖球平面方程和球面方程,可求待求大圆方程。
这个思路应该可行吧?
试下:
1.球面任意点经纬坐标: P(u,v),u为纬度坐标,取-90~90度;v为经度坐标,取0~360度。当然,可换算为弧度值。
其直角坐标为:P(Xp,Yp,Zp),满足球面方程:
Xp = R*cos(u)*cos(v)
Yp = R*cos(u)*sin(v)
Zp = R*sin(u)
2.过该点和球面相切的切平面方程应该是:
Q(Xq,Yq,Zq)满足如下约束:
(Xq-Xp)/(Yq-Yp) = tan(v) //这个式子似乎有问题
sqrt((Xq-Xp)^2+(Yq-Yp)^2)/(Zq-Zp) = tan(u)
正确推导如下:
球面任意点切平面方程
dx = Xq-Xp
dy = Yq-Yp
dz = Yq-Yp
d1= sqrt(dx^2 + dy^2)
d2=dz*tan(u)
d3=d2/tan(v)
d4=dx/sin(v)
d1^2=d2^2+(d4-d3)^2
dx^2 + dy^2 = dz^2*tan^2(u)+(dx-dz*tan(u)cos(v))^2/sin^2(v)
(Xq-Xp)^2 + (Yq-Yp)^2 =( (Zq-Zp)*tan(u))^2+((Xq-Xp)-(Zq-Zp)*tan(u)*cos(v))^2/sin^2(v)
3.在切平面上的待求大圆切线的切线方程应该是:
满足2.中切平面方程基础上增加如下约束:
sin(a)=d5/d6
d5 = dz/cos(u)
d6 = sqrt(dx^2+dy^2+dz^2)
即:
(dx^2+dy^2+dz^2)*sin^2(a)*cos^2(u) = dz^2
((Xq-Xp)^2 + (Yq-Yp)^2 + (Zq-Zp)^2)* sin^2(a)*cos^2(u)-((Zq-Zp)^2) = 0
其中的a即是点P的方位角。如:东偏北60度。
4.剖平面方程:
剖平面就是图中OPQ三点决定的平面。
这是已知过(0,0,0),(Xp,Yp,Zp)和 (Xq,Yq,Zq)的平面方程。
设为:ax+by+cz=0
a = Yp*Zq-Zp*Yq;
b = Zp*Xq-Xp*Zq;
c = Xp*Yq-Yp*Xq;
即:
(Yp*Zq-Zp*Yq)x +(Zp*Xq-Xp*Zq)y + (Xp*Yq-Yp*Xq)z = 0;
5.大圆方程:
大圆方程就是同时满足球面方程和剖面方程的点的约束条件。
将
x = R*cos(u)*cos(v)
y = R*cos(u)*sin(v)
z = R*sin(u)
代入
(Yp*Zq-Zp*Yq)x +(Zp*Xq-Xp*Zq)y + (Xp*Yq-Yp*Xq)z = 0;
得:
(Yp*Zq-Zp*Yq)*R*cos(u)*cos(v) +(Zp*Xq-Xp*Zq)* R*cos(u)*sin(v) + (Xp*Yq-Yp*Xq)*R*sin(u) = 0;
此式中u,v为变量,之前任意点P(u,v)是任选的常量。也就是说,选定一个u,v,a就可以得到一个大圆方程,从而约束一个圆圈的(u,v).在确定Q(Xq,Yq,Zq)时,可通过任意设定一个离P距离为D的点(D^2=dx^2+dy^2+dz^2)即可确定常量点Q。
似乎就是这样的了。
https://blog.sciencenet.cn/blog-33982-591492.html
上一篇:
八哨兵问题算法演示程序下一篇:
球面剖切圆的绘图算法问题(已解决,附程序下载)