用matlab画曲面图时,比如画一个旋转抛物面,如果如下写程序:
x=-1:0.02:1;
y=x;
[x1,y1]=meshgrid(x,y);%生成画图用的xy网格数据
z=x1.^2+y1.^2;
%C=0.1*z;%设置图像颜色的矩阵,跟z同形状
mesh(x1,y1,z)%画三维网格图
figure
surf(x1,y1,z)%画三维曲面图
图像就会这样:
跟我们想象的旋转抛物面不怎么一样,边界是方的。一种方法是用极坐标生成网格数据,这种方法的局限性较大,生成的xy轴定义域网格数据都是圆形的(能否生成其他形状定义域没有好好研究),下面的方法基本是任意形状的定义域都可以。先上程序和图:
x=-1:0.001:1;
y=x;
[x1,y1]=meshgrid(x,y);%生成画图用的xy网格数据
z=x1.^2+y1.^2;
[m,n]=size(x1);
for i=1:m
for j=1:m
if x1(i,j)^2+y1(i,j)^2>1
x1(i,j)=nan;%将不想要的点横坐标或纵坐标值改为nan
end
end
end
figure
mesh(x1,y1,z)%画三维网格图
figure
surf(x1,y1,z)%画三维曲面图
%shading flat;%去掉绘图时网格线的黑边,防止点太密时曲面呈黑色
shading interp%绘图时网格线颜色自动插值,让图像像颜色更自然
因为去掉了surf画图的黑色网格线,所以上面这段程序用surf和mesh画图结果一样。
为防止边缘出现毛边,该段程序取点时取得比较密集。
原理通过程序大家应该看清楚了,就是把不想要的点横坐标或纵坐标改成nan。比如本例中不想要的点,就将其横坐标都改为了nan,这样三维坐标缺少一维,图像自然就不显示了。
再来个马鞍面:
x=0:0.01:1;
y=x;
[x1,y1]=meshgrid(x,y);
[m,n]=size(x1);
for i=1:m
for j=1:n
if abs(x1(i,j))+abs(y1(i,j))>1
x1(i,j)=nan;
y1(i,j)=nan;
end
end
end
z=x1.*y1;
mesh(x1,y1,z)