错误算法
学习完三维曲面后,我尝试用相同的算法画一个球体,算法如下
r=5;
t=0:pi/2:2*pi;
x=r.*cos(t);
y=r.*sin(t);
[X,Y]=meshgrid(x,y);
z=sqrt(25-X.^2-Y.^2);
mesh(X,Y,z);
运行后报错
错误使用 mesh (line 71)
X、Y、Z 和 C 不能是复数。
原因:用X,Y矩阵中的值求z时,有一些(x,y)大于5^2
参考sphere函数
观察sphere函数的矩阵,我得到启发,球体可以看作N层叠加,每一层都是一个正多边形,Z值相同。
function func(number,R)
% func :画球体
% number:多边形边数
% R:球体半径
% 算法:调用子函数polygon画每一层。本函数没有返回值。
% [a b]=polygon(5,2);测试函数
m=0:0.1:R;
% m2=fliplr(m);因算法修改,不再使用
z1=zeros(length(m),number+1);%初始化提高性能
j=1;
for i=m
r= sqrt(R^2 - i^2);
[x(j,:),y(j,:)]=polygon(number,r);
z1(j,:)=i;
j=j+1;
end
z2=-1.*z1;%负半轴
hold on;
surf(x,y,z1);
surf(x,y,z2);
hold off;
axis equal;view(3);%不加这句的话,只看到xy平面,不知原因?
xlabel('x');zlabel('z');
end
function [retX, retY]=polygon(varargin)
% polygon 计算每一层的X,Y矩阵
% argin1:多边形边数
% argin2:半径
% retX,retY:返回X,Y矩阵
% 算法:先算中心角。每个顶点偏转中心角*n弧度。矩阵列数:比边数多1
number=varargin{1}; r=varargin{2};
each=2*pi/number;
t=0:each:2*pi;
retX=r.*cos(t);
retY=r.*sin(t);
end