二次曲面是一种参数曲面,可以用一定的数学方程来表示。变换方程中的参数,可以改变曲面的形态。柱面、球面和锥面等是常见的二次参数曲面。MATLAB提供了创建柱面和球面的函数。
1.柱面
用cylinder函数生成柱面。该函数的调用格式为:
cylinder 生成单位柱面。可以用surf或mesh函数绘制,或不提供输出参数直接画图。
[X,Y,Z]=cylinder 返回半径为1的柱面的x, y和z坐标。
[X,Y,Z]=cylinder(r) 返回用r定义周长曲线的柱面的三维坐标。cylinder函数将r中的每个元素作为半径。
[X,Y,Z]=cylinder(r,n) 返回用r定义周长曲线的柱面的三维坐标。在它周围有n个间隔点。
cylinder(...) 无输出参数,用surf函数绘柱面。
下面绘制一个默认柱面,用随机生成的颜色着色。
>> cylinder
>> axis square
>> h=findobj('Type','surface');
>> set(h,'CData',rand(size(get(h,'CData'))))
结果如图6-9所示。
可以沿纵轴方向改变柱面的半径。例如,
>> t=- pi:pi/10:pi;
>> [X,Y,Z]=cylinder(1+sin(t));
>> surf(X,Y,Z)
>> axis square
生成图6-10。
图6-9 默认柱面 图6-10 改变柱面的半径
2.球面
绘制曲面的surf函数可以有两个额外的矢量或矩阵参数,它们用指定的X和Y数据描述曲面。如果Z是m×n的矩阵,X是大小为n的矢量,Y是大小为m的矢量,则mesh(X,Y,Z,C)用顶点来描述网格曲面。这些顶点的颜色为C(i, j),位置为(X(j), Y(i), Z(i, j)),其中X对应于Z的列,Y对应于Z的行。
更一般地,如果X,Y,Z和C是维数相同的矩阵,则mesh(X,Y,Z,C)用顶点来描述网格曲面。这些顶点的颜色为C(i, j),位置为(X(i, j), Y(i, j), Z(i, j))。
下面用球坐标绘制一个圆球,并按照Hadamard矩阵中的加减模式进行着色,Hadamard矩阵用于信号处理,是一个正交矩阵。矢量theta和phi的取值范围为-≤theta≤,-/2≤phi≤。因为theta是一个行矢量,phi是一个列矢量,X, Y和Z均为矢量。
>> k=5;
>> n=2^k-1;
>> theta=pi*(-n:2:n)/n;
>> phi=(pi/2)*(-n:2:n)'/n;
>> X=cos(phi)*cos(theta);
>> Y=cos(phi)*sin(theta);
>> Z=sin(phi)*ones(size(theta));
>> colormap([0 0 0;1 1 1])
>> C=hadamard(2^k);
>> surf(X,Y,Z,C)
>> axis square
结果如图6-11所示。
除了使用surf函数外,MATLAB还直接提供了绘制球面的sphere函数。
下面用该sphere数创建一个默认球面。
>> sphere
>> axis equal
生成图6-12。
图6-11 球面 图6-12 默认球面