童德茂,張 華
(阜陽職業技術學院 工程科技學院,安徽 阜陽 236031)
?
Matlab用于動畫制作旋轉曲面設計
童德茂,張華
(阜陽職業技術學院 工程科技學院,安徽 阜陽 236031)
摘要:旋轉曲面可以構造成現代工業中諸多產品形狀,選擇一種工程語言將旋轉曲面工件造型動態直觀演示出來是非常必要的。Matlab以矩陣作為數據操作的基本單位,擁有開放式可擴充環境、強大的繪圖功能和靈活的程序設計技巧,融合Matlab矩陣處理問題特點,列舉動畫制作旋轉曲面程序,以探究Matlab實現旋轉曲面動畫制作的完整過程。
關鍵詞:Matlab;旋轉曲面;動畫程序;幾何變換
Matlab以矩陣作為數據操作的基本單位,集成了圖形圖像處理、數值分析、矩陣運算、可視化和仿真等諸多強大功能的交互式計算機環境工程語言[1-2]。在Matlab諸多應用中,最能給學者們的研究帶來方便的是它的開發式可擴充環境和數據可視化應用,此外,人們還特別關注Matlab軟件在制作精確、形象的動畫方面的應用。在極限趨近研究中,我們已經探討了Matlab直觀動態地表示極限漸進過程動畫[3]。融合Matlab在矩陣運算中的特點,深層次探討Matlab的應用,使用axis,ho1d on和for...end等Matlab語句,人們可直接用Matlab獲得動畫繪制而發掘新的契合點[3]。如語句hold on是保證在同一坐標軸內完成畫圖,而for...end循環則是繪制動畫最為關鍵的語句,上述命令還僅僅是Matlab工具軟件中實現動畫制作的基本架構。為獲取內容豐富且生動的旋轉曲面動畫,要選取有效的數據采樣和切實可行的制作動畫方式方法。工程設計和曲面造型中普遍應用旋轉曲面,應用旋轉曲面可以廣泛制作現代工業產品形狀[4],因此,各領域工作者一直廣泛關注旋轉曲面的應用。動畫表現方式克服了傳統靜態視覺表現的不足,多種動畫表現方法也就相繼誕生,閆宇晗、常鑫分析在C#中用GDI實現圖形動態顯示[5]。本文探討Matlab用于繪制旋轉曲面動畫的形成過程。
1繪制旋轉曲面動畫研究
1.1繪制曲面矩陣的各列呈現旋轉曲面形成過程
選取一定形狀的曲線圍繞固定軸旋轉而構造成的曲面即為旋轉曲面[6]。在Matlab動畫設計制作旋轉曲面時,若能繪制出任一曲線在旋轉過程中各個位置產生的曲線,旋轉曲面生成過程將會被真實完整的展示出來。在幾何空間中,某一曲線繞固定軸旋轉產生在每個位置的系列曲線都對應著Matlab矩陣所描述旋轉曲面數據列,順次地畫出矩陣各列數據,則會生動呈現生成旋轉曲面過程的動畫。
例中a,b為常數,取a=15,b=2,編制Matlab的·M文件并運行,動態演示旋轉橢球面繪制過程。
程序的M文件如下:
clear;
a=15;
b=2;
t=0:pi/30:2*pi;
n=length(t);
y=15*cos(t);
z=2*sin(t);
x =0*ones(1,n);
plot3(x,y,z)
pause(1)
for i=0:pi/60:pi;
x=y.*sin(i);
y1=y.*cos(i) ;
plot3(x,y1,z )
pause(1)
grid on
hold on
view(-20,60)
end
hold off
圖形動畫結果如圖1所示。

圖1橢球面動畫形成二幅截圖
運行例1中的Matlab程序演示了橢圓繞Z軸旋轉而構成橢球面的形象直觀完整過程,運用動畫鮮明地展示了旋轉橢球面的生成和旋轉橢球面的本質[7]。以直線、圓、雙曲線、拋物線為例,分別編寫它們的·M程序文件,則可形象直觀動態地演示相應曲線繞固定軸(Z軸)旋轉生成旋轉曲面的完整過程。
盡管例1的程序比較簡單,但程序運行速度卻非常快,能清晰和直觀呈現旋轉曲面的具體形成過程。因運行程序過程中不能一一繪制出旋轉曲面生成中的各條母線,故繪制旋轉曲面是由有間隔的曲線構成的,展示的曲面動畫效果不太理想。即使設法增加繪制曲線的密集度,還是彌補不了繪制旋轉曲面的缺憾,但對形象和直觀實現一般的旋轉曲面演示還是有實用價值的。為了解決上述程序設計的缺憾,最有效的操作就是填實畫出的曲線間的間隙,在程序設計的實際操作上用surf()或mesh()函數畫旋轉曲面片替代plot3()畫旋轉曲線,就可以消除此類問題。
1.2選矩陣A中相鄰兩列A(:,i-1,i)繪制曲面片
在同一坐標系中,設計旋轉曲面程序時,按序把描述曲面矩陣的相鄰兩列數據點用surf()或mesh()函數以曲面片形式繪制出來,畫出的旋轉曲面形成過程的動畫將會更為生動形象真實。
例2在區間[-4;4;-4;4],作16z=x2+y2拋物線生成橢圓拋物面過程。

a=sqrt(3);
r=0:0.1:a;
t=0:0.1:2*pi;
[T,R]=meshgrid(t,r);
X=4*cos(T).*R;
Y=4*sin(T).*R;
Z=2*ones(size(T)).*R.^2;
axis([-10,10,-10,10,0,10]);
hold on;
n=size(Z,2);
for i=2:n
surf(X(:,i-1:i),Y(:,i-1:i),Z(:,i-1:i));
drawnow;
pause(0.2);
end
結果如圖2所示圖形動畫。

圖2動畫形成旋轉拋物曲面片二幅截圖
對比圖1和圖2,明顯看出旋轉曲面片繪制的圖2視覺效果的動畫更真實和完美。因A (:,i-1:i)和A(:,[i-1:i])皆能描述曲面矩陣A中相鄰兩列[8],將例2中surf(X(:,i-1:i),Y(:,i-1:i),Z(:,i-1:i))換成 surf(X(:,[i-1,i]),Y(:,[i-1,i]),Z(:,[i-1,i])),仍達到同樣的效果。
1.3NaN實現旋轉曲面動畫效果
Matlab中NaN是非數值特殊量,一般情況下,NaN是在有正負無窮大參與的加減、乘法、除法的0/0、∞/∞等式中產生。Matlab中的ZaZ常數表示是一些不可用數據。若將曲面矩陣數據的某一部分用NaN描述,則會裁剪函數值為ZaZ的部分,進而將在曲面上形成孔洞效果[9]。將旋轉曲面矩陣的第i列后的各列均賦值為NaN,順序繪制圖形,得到圖3所示的有助于直觀認識工業產品形狀的旋轉曲面動畫效果。
曲線為25(x2+y2)-16z2=400動畫程序M文件如下:
z=-15:0.1:15;
y=4*sqrt( 1+z.^2 /25);
[x1,y1,z1]=cylinder(y,40);
z1=15.*z1-7.5;
axis([-20,20,-20,20,-10,10]);
hold on;
n=size(z1,2);
for i=1:n;
z11=z1
z11(:,i+1:n)=NaN
mesh(x1,y1,z11)
drawnow
pause(0.2)
end
圖形動畫如圖3所示。

圖3NaN繪制旋轉拋物面二幅截圖
e=0:0.1:10;
h=sqrt(3*e);
[a,b,c]=cylinder(h,100);
c1=3*c+1;
axis([-10,10,-10,10,-5,5]);
hold on;
n=size(c1,2);
for i=1:n;
c11=c1;
c11(:,i+1:n)=NaN;
mesh(a,b,c11);
mesh(a,b,-c11);
drawnow;
pause(0.2);
end
圖形動畫結果如圖4所示。

圖4旋轉雙曲拋物動畫過程截圖
Inf同NaN一樣也是無窮大量,繪圖時函數值為inf這些數據點的部分也不顯示,用inf代替例4程序中的NaN,同樣達到實現旋轉曲面形成的動畫效果。
例5修改實例4程序為:
e=0:0.1:10;
h=sqrt(3*e);
[a,b,c]=cylinder(h,100);
c1=3*c+1;
axis([-10,10,-10,10,-5,5]);
hold on;
n=size(c1,2);
for i=1:n;
c11=c1;
c11(:,i+1:n)=inf;
mesh(a,b,c11);
mesh(a,b,-c11);
drawnow;
pause(0.2);
end
圖形動畫結果如圖4所示。
2高層指令生成動態圖形
利用Matlab生成旋轉曲面動畫有助于直觀認識工業產品形狀,我們還可以使用Matlab“高層”圖形中的彗星軌線指令方便地產生圖形及色彩動態變化效果[10]。
例6實現衛星返回地球的運動軌跡示意動態演示。其程序M文件如下:
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([133 65])
comet3(x,y,z,0.02)
hold off

圖5衛星返回地球的運動軌跡示意
圖形動畫結果如圖5所示。
3結束語
本文根據Matlab處理數據的特點,重點以動畫演示繪制旋轉曲線、曲面片、給曲面矩陣賦值NaN或inf實現旋轉曲面設計為例,完整動態地演示旋轉曲面形成過程,Matlab生成旋轉曲面動畫表現方式克服了傳統靜態視覺表現的不足。例題中實現旋轉曲面動畫制作對于其它曲面動畫作圖也具有一定參考和指導作用。為方便今后直接運行使用,還可在適當gui交互界面中嵌入例題的程序,或將其保存為m文件或m函數。
參考文獻:
[1]葛哲學.精通Matlab [M].北京:電子工業出版社,2008:126-147.
[2]向修棟,付云芝. 在matlab中實現旋轉曲面的動畫設計[J].計算機技術與發展,2011(3):53- 55.
[3]童德茂.探討Matlab在高職《高等數學》教學中的應用[J].阜陽師范學院學報(自然科學版), 2010(3):79-82.
[4]張先波,楊文穎,宋來忠,等.給定主曲率函數的旋轉曲面設計[J].計算機工程與設計,2009(4):1030-1035.
[5]閆宇晗,常鑫.在C#中用GDI實現圖形動態顯示[J].計算機技術與發展,2006,16(12):117-119.
[6]劉衛國.Matlab程序設計與應用[M].北京:高等教育出版社,2006:56-100.
[7]趙亞男,牛言濤.MATLAB在解析幾何教學中的應用[J].長春大學學報,2014(4):54-58.
[8]胡華.用Matlab解決數學分析中的圖形問題[J].西南民族大學學報,2003,29( 6):766-771.
[9]段俊生,安建業,徐立.MATLAB曲面繪制中的挖補方法[J].大學數學,2006,22( 4):36-39.
[10]張志涌.精通Matlab R2011a[M].第二版.北京:北京航空航天大學出版社,2012:392-397.
[10]陳素根.Matlab在“計算機圖形學”教學中的應用[J].安慶師范學院學報(自然科學版), 2014(3):131-134.
Designs of Matlab to Make Animation of Revolution Surface
TONG De-mao,ZHANG Hua
(Department of Engineering Technology, Fuyang Vocational and Technical College, Fuyang 236031, China)
Abstract:Many product shapes can be generated by the rotating surface in modem industry. It is very necessary to choose a project way to surface of revolution workpiece modelling dynamic visual presentation. Matlab has an open extensible environment and strong drawing-graphics function and flexible program design skills. Combining with the characteristics of the matrix of dealing with the problem in matlab and using the matrix as the basic unit of data operation, we explore the rotation surface integrity of the animation process.
Key words:matlab, rotation surface, animation program, geometry
文章編號:1007-4260(2015)02-0125-05
中圖分類號:TP312
文獻標識碼:A
作者簡介:童德茂,男,安徽金寨人,碩士,阜陽職業技術學院工程科技學院副教授,研究方向為Matlab圖形圖像處理、數值計算。
基金項目:安徽省教育振興計劃項目(2013-86)和安徽省質量工程項目(2014jxtd059)。
收稿日期:2014-12-25