我正在尝试在 Matlab 中绘制一个球体而不使用 Sphere 函数。这是我的代码:
r = 2;
[ x,y ] = meshgrid(-4:0.1:4);
z = sqrt(r^2-x.^2-y.^2);
mesh(real(z));
hold on
mesh(real(-z));
Run Code Online (Sandbox Code Playgroud)
上面的代码确实生成了方程 r^2=x^2+y^2+z^2 的球体。唯一的问题是有一个水平面切割球体。
我的问题是如何绘制一个不显示水平面的球体?
我不使用球体函数的原因是因为我想绘制表面方程。如果我使用 Sphere 函数,那么 Matlab 会假设我的表面将是一个球体。
您应该考虑切换到极坐标。MATLAB 可以绘制拓扑上等效于矩形网格的曲面:
N = 20;
thetavec = linspace(0,pi,N);
phivec = linspace(0,2*pi,2*N);
[th, ph] = meshgrid(thetavec,phivec);
R = ones(size(th)); % should be your R(theta,phi) surface in general
x = R.*sin(th).*cos(ph);
y = R.*sin(th).*sin(ph);
z = R.*cos(th);
figure;
surf(x,y,z);
axis vis3d
Run Code Online (Sandbox Code Playgroud)
诀窍是在极坐标中你有一个矩形网格。
正如您在上面的公式中看到的,在这个约定中theta
是极角,phi
是方位角,这在数学和物理中很常见。您可以用来sph2cart
进行从球面坐标到笛卡尔坐标的转换,但是您需要输入角度的方位角和仰角,它们的定义有点不同。
嗯,当然有更好的图...但是如果您将 z 矩阵中的条目设置为 nan,它就可以工作:
temp = real(z);
temp(temp==0) = nan;
Run Code Online (Sandbox Code Playgroud)
或者您可以使用隐式 3D 绘图。在 matlab 文件交换中,您可以找到相应的函数(Matlab File Excahnge),相应的脚本如下所示:
f = 'x^2 +y^2 +z^2 -4';
ezimplot3(f,[-5 5])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18847 次 |
最近记录: |