APP下载

Matlab用于动画制作旋转曲面设计

2016-01-13童德茂

童德茂,张 华

(阜阳职业技术学院 工程科技学院,安徽 阜阳 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