plot(x,y,'g');axis square;hold on comet(x,y,0.01);hold off
【例6.4.3.1- 2】卫星返回地球的运动轨线示意。(请读者自己在指令窗中运行以下指令。)
shg;R0=1;
a=12*R0;b=9*R0;T0=2*pi;
T=5*T0;dt=pi/100;t=[0:dt:T]'; f=sqrt(a^2-b^2); th=12.5*pi/180; E=exp(-t/20);
x=E.*(a*cos(t)-f);y=E.*(b*cos(th)*sin(t));z=E.*(b*sin(th)*sin(t)); plot3(x,y,z,'g')
[X,Y,Z]=sphere(30);X=R0*X;Y=R0*Y;Z=R0*Z; grid on,hold on,surf(X,Y,Z),shading interp
x1=-18*R0;x2=6*R0;y1=-12*R0;y2=12*R0;z1=-6*R0;z2=6*R0; axis([x1 x2 y1 y2 z1 z2])
view([117 37]),comet3(x,y,z,0.02),hold off
图 6.4 -21
6.4.3.2 色图的变幻
【例 6.4.3.2-1】色彩变幻(因印刷关系,无法表现。请读者自己在指令窗中运行以下指令。)
peaks spinmap
6.4.3.3 影片动画
【例6.4.3.3-1】三维图形的影片动画。(因印刷关系,无法表现本例。请读者自己在指令窗中运行以下指令。)
clf;shg,x=3*pi*(-1:0.05:1);y=x;[X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R; h=surf(X,Y,Z);colormap(jet);axis off n=12;mmm=moviein(n); for i=1:n rotate(h,[0 0 1],25); mmm(:,i)=getframe; end
movie(mmm,5,10)
6.5 三维图形的精细控制
26
6.5.1 视点控制和图形的旋动 6.5.1.1 视点控制view 6.5.1.2 图形旋动rotate
【例 6.5.1.2-1】旋转指令示例。(利用rotate制作动画,请看例6.4.4.3-1)
shg;clf;[X,Y] = meshgrid([-2:.2:2]);Z = 4*X.*exp(-X.^2-Y.^2); G=gradient(Z);subplot(1,2,1),surf(X,Y,Z,G) subplot(1,2,2),h=surf(X,Y,Z,G);
rotate(h,[-2,-2,0],30,[2,2,0]),colormap(jet)
图 6.5-3
6.5.2 色彩控制
6.5.2.1 用色风格colordef 6.5.2.2 色图colormap
【例6.5.2.2-1】红绿蓝三色色图。演示:色图和色图矩阵。
CM=[1 0 0;0 1 0;0 0 1];m=size(CM,1);Y=[1:m+1;1:m+1]'; pcolor(Y),colormap(CM) 43.532.521.5111.21.41.61.82图 6.5-4
【例6.5.2.2-2】随机色图。演示:色图和色图矩阵。
rand('seed',2);CM=rand(16,3);m=size(CM,1);Y=[1:m+1;1:m+1]';
27
pcolor(Y),colormap(CM) 16141210864211.21.41.61.82图 6.5-5
【例6.5.2.2-3】演示:(A)用MATLAB预定义的两个色图矩阵,构成一个更大的色图阵。(B)把色轴的范围设置得比着色阵 C的数据范围小,使色图CM的两端色彩展宽,中间色彩压缩。(C)把色轴的上限增加一个C阵数据宽度,使着色时只使用色图CM上半阵的色彩。这种方法使同一图形窗中的不同对象实际上可以使用MATLAB的不同预定义色图。(D)为了使色标尺正确反映色轴的设置,指令colorbar必须在caxis 之后使用。
Z=peaks(20);C=Z;Cmin=min(min(C));Cmax=max(max(C));DC=Cmax-Cmin;
CM=[autumn;winter]; %<2> colormap(CM),subplot(1,3,1),surf(Z,C)
caxis([Cmin+DC*2/5,Cmax-DC*2/5]),colorbar('horiz') %<4> subplot(1,3,2),surf(Z,C),colorbar('horiz')
subplot(1,3,3),surf(Z,C),caxis([Cmin,Cmax+DC]),colorbar('horiz')%<6>
图 6.5-6
6.5.2.3 浓淡处理shading
【例6.5.2.3-1】三种浓淡处理方式比较。
clf;Z=peaks(20);colormap(jet) subplot(1,3,1),surf(Z)
subplot(1,3,2),surf(Z),shading flat
subplot(1,3,3),surf(Z),shading interp
28
图 6.5-7
6.5.3 照明和材质处理 6.5.3.1 灯光light 6.5.3.2 照明模式lighting
6.5.3.3 控制光效果的材质指令material 6.5.3.4 surfl指令的精细调用格式
【例6.5.3.4-1】灯光、照明、材质指令所表现的图形。
clf;
[X,Y,Z]=sphere(40); colormap(jet) subplot(1,2,1);surf(X,Y,Z);shading interp light ('position',[2,-2,2],'style','local') lighting phong material([0.5,0.3,0.5,10,0.5]) subplot(1,2,2);surf(X,Y,Z,-Z);shading flat light;lighting flat light('position',[-1,-1,-2],'color','y') light('position',[-1,0.5,1],'style','local','color','w') material([0.4,0.5,0.3,10,0.3])
%<3> %<4> %<5> %<6> %<7> %<8> %<9> %<10> %<11> %<12>
图 6.5-8
29
6.5.4 透明处理
6.5.4.1 决定图形透明性质的基本对象属性 6.5.4.2 图形对象透明化机理 6.5.4.3 透明化的高层指令及其应用
【例6.5.4.3-1】本例演示:最简便的透明化处理,即只要一条简单的指令就可以控制所画曲面的透明度。此时,曲面各点的透明度都相同。在本例中,当aa接近于0时,曲面的透明度高;aa接近于1时,曲面几乎不透明。
[X,Y,Z]=peaks(20); surf(X,Y,Z); shading flat aa=0.5;
alpha(aa)
图 6.5-9
【例6.5.4.3-2】本例演示:(A)控制透明度在一个轴维方向(如x轴方向)上线性变化的简单方法;(B)由于本例使用的是缺省透明度表(上斜线型),所以x值较小处透明度高,而x 值较大处几乎不透明。(C)假若在本例所列指令中,再加入透明度表设置指令,如alphamap('vup')等,则就可实现较复杂的透明度表现。
[X,Y,Z]=peaks(20); surf(X,Y,Z); shading flat options='x'; alpha(options)
xlabel('x \\rightarrow')
30