sph2cart函数是Matlab中从球坐标向直角坐标变换的函数。
注: 图片引用自matlab帮助文件
注意到这个定义,Azimuth角和我们通常习惯的球坐标定义角是一样的,但Elevation却和我们平常定义的不同,我们平时习惯的球坐标定义的 θ=π/2−Elevation 。
因此这也导致坐标变换公式和我们平时使用的不同。
x=r.∗sin(θ).∗cos(Azimuth)
y=r.∗sin(θ).∗sin(Azimuth)
z=r.∗cos(θ)
提到这个角度定义最主要的问题,是这个角度与卦限位置相关。Matlab使用的角度定义往往使我们陷入比较困惑的境地。当然解决这个问题也比较简单,我们可以在调用sph2cart时将角度做一次转换即可。
下面给一个例子。
clear;clc;clf;
r=450;
theta=linspace(pi/2,pi);
phi=linspace(0,pi/2); % 第五卦限
[tt,pp]=meshgrid(theta,phi);
[x1,y1,z1] = sph2cart(pp,pi/2-tt,r);
s1 = surf(x1,y1,z1);
shading interp;
axis equal
view([120 10]);
hold on;
theta=linspace(0,pi/2);
phi=linspace(0,pi/2); % 第一卦限
[tt,pp]=meshgrid(theta,phi);
[x2,y2,z2] = sph2cart(pp,pi/2-tt,r);
s2 = surf(x2,y2,z2);
shading interp;
theta=linspace(0,pi/2);
phi=linspace(pi*3/2,pi*2); % 第四卦限
[tt,pp]=meshgrid(theta,phi);
[x3,y3,z3] = sph2cart(pp,pi/2-tt,r);
s3 = surf(x3,y3,z3);
shading interp;
theta=linspace(pi/2,pi);
phi=linspace(pi*3/2,pi*2); %第八卦限
[tt,pp]=meshgrid(theta,phi);
[x4,y4,z4] = sph2cart(pp,pi/2-tt,r);
s4 = surf(x4,y4,z4);
shading interp;
xlabel('x');ylabel('y');zlabel('z');
axis([-500,500,-600,600,-600,600]);
set(s1,'FaceColor','r','FaceAlpha',0.3);
set(s2,'FaceColor','b','FaceAlpha',0.3);
set(s3,'FaceColor','y','FaceAlpha',0.3);
set(s4,'FaceColor','c','FaceAlpha',0.3);