资源描述
《MATLAB》课程论文
MATLAB在三维作图中的应用
姓名:
学号:
专业:
班级:
指导老师:
学院:
完成日期:
MATLAB在三维作图中的应用
[摘要]MATLAB提供了一系列的绘图函数,用户不仅不许考虑绘图细节,只需给出一些基本的参数就能得到所需要的图形,这一类函数称为高层绘图函数。除此之外,MATLAB还提供了直接对句柄进行操作的一系列的低层的绘图操作。这类操作将图形的每个元素看做是一个独立的对象,系统给每个对象独立的分配一个句柄,以后可以通过该句柄对改图元素进行操作,而不影响图形的其他部分。高层绘图操作简单明了,方便高效,使用户最常使用的绘图方法,而低层绘图操作控制和表现图形的能力更强,为用户自主绘图创造了条件。其实MATLAB的高层绘图函数都是利用低层绘图函数建立起来的。所以MATLAB的计算准确、效率高、使用快捷等优点常被广泛应用于科学和工程领域.
[关键字]MATLAB语言 三维图形 图像处理 绘制
一, 问题的提出
MATLAB语言是当前国际学科界应用很广泛的一种软件,强大的绘图功能是MATLAB的特点之一。MATLAB提供了一系列的绘图函数,利用它强大的图像处理来绘制三维图形既简单而且也很方便。在绘制三维图形的过程中也用到了MATLAB语言的其他功能,绘制三维图形时用到了它提供的一些函数,利用这些函数可以方便的生成一些特殊矩阵,因此可生成一个坐标平面。MATLAB语言强大的功能也在二维三维绘图中的得到了很广泛的应用,利用它所提供的精细的图像处理功能,如MATLAB还提供了直接对句柄进行操作的一系列的低层的绘图操作。这类操作将图形的每个元素看做是一个独立的对象,系统给每个对象独立的分配一个句柄,以后可以通过该句柄对改图元素进行操作,而不影响图形的其他部分。高层绘图操作简单明了,使用户最常使用的绘图方法,而低层绘图操作控制和表现图形的能力更强,为用户自主绘图创造了条件,还可以对所绘制的三维图形作一个修饰的处理。MATLAB语言具有强大的以图形化显示矩阵和数组的能力,同时它给这些图形增加注释并且可以对图形进行标注和打印。MATLAB的图形技术包括三维的可视化、图形处理、动画等高层次的专业图形的高级绘图,例如图形的光照处理、色度处理以及四维数据的表现等。那么,如何把它强大的功能应用于实际应用中,下面我们将用实例说明MATBLE在三维作图中的应用。
二,MATLAB的主要功能及特点
MATLAB近几年广泛用于图像处理和识别, 使用MATLAB设计模式识别应用软件将使设计者获得更大的自由, 可以任意执行特殊的算法和实现复杂的操作,MATLAB之所以成为世界顶级的科学计算与数学应用软件, 是因为它随着版本的升级与不断完善而具有愈来愈强大的功能。(1)数值计算功能。(2)符号计算功能。(3)数据分析功能。(4)动态仿真功能。(5)图形文字统一处理功能。
MATLAB 有三大特点:一是功能强大。主要包括数值计算和符号计算、计算结果和编程可视化、数学和文字统一处理、离线和在线计算。二是界面友好,编程效率高。MATLAB 是一种以矩阵为基本单元的可视化程序设计语言, 语法结构简单, 数据类型单一,指令表达与标准教科书的数学表达式相近。三是开放性强。MATLAB 有很好的可扩充性, 可以把它当成一种更高级的语言去使用。使用它很容易编写各种通用或专用应用程序。四是matble拥有丰富的库函数。
三, MATBLE在三维制图中的问题
例1、两个同直径圆管相交程序
m=30; %定义变量
theta=(0:m)/m*2*pi; %取角度
z=1.2*(-m:2:m)/m; %设置竖直圆管的高度
r=ones(size(z)); %生成同z大小的全一矩阵
z1=z'*ones(1,m+1); %生成第一个圆管的坐标矩阵
x1=r'*cos(theta); %生成第一个圆管的坐标矩阵
y1=r'*sin(theta); %生成第一个圆管的坐标矩阵
surf(x1,y1,z1); %绘制竖立的圆管
x=(-m:2:m)/m; %产生行矩阵
x2=x'*ones(1,m+1); %生成第一个圆管的坐标矩阵
y2=r'*cos(theta); %生成第一个圆管的坐标矩阵
z2=r'*sin(theta); %生成第一个圆管的坐标矩阵
surf(x2,y2,z2); %绘制平放的圆管
surf(x1,y1,z1);hold on; %竖立的圆管上添加平放的圆管
surf(x2,y2,z2); %绘制平放的圆管
axis equal,axis off %去掉坐标轴
title('两个同直径圆管的相交'); %添加标题
hold off %关闭图形保持
运行结果如图1所示。
图1 两个同直径圆管的相交图形
两个同直径圆管相交的前视图的程序
x1=[-1,-1,1,1,-1]; %在x轴上取点
y1=[1.2,-1.2,-1.2,1.2,1.2]; %在y轴上取点
x2=[-1,1]; %在x轴上取点
y2=[1,-1]; %在y轴上取点
x3=[1,-1]; %在x轴上取点
y3=[1,-1]; %在y轴上取点
plot(x1,y1); %把各点连起来设置外围线
hold on %设置图形保持状态
plot(x2,y2); %绘制两条相交直线中的一条
hold on %设置图形保持状态
plot(x3,y3); %绘制两条相交直线中的另一条
ax1=[0,1,1]; %在x轴上取点
ay1=[0,-1,1]; %在y轴上取点
ax2=[0,-1,-1]; %在y轴上取点
fill(ax1,ay1,'g'); %填充颜色
hold on %设置图形保持状态
fill(ax2,ay2,'g') %添充颜色
axis equal,axis off; %去掉坐标轴
title(' 两个同直径圆管相交的前视图'); %给绘制的图形添加标题
运行结果如图2所示。
图2 两个同直径圆管相交的前视图图形
两个同直径圆管相交的侧视图程序
r1=1; %定义变量
t=0:pi/90:2*pi; %取角度
xc=r1*cos(t); %水平圆柱
zc=r1*sin(t); %水平圆柱
fill(xc,zc,'y'); %给水平圆柱填充颜色
hold on %设置图形保持状态
tx1=[1,1,-1,-1]; %在x轴上取点
ty1=[0,1,1,0]; %在y轴上取点
plot(tx1,ty1); %绘制竖立的圆管
hold on %设置图形保持状态
tx2=[1,1,-1,-1]; %在x轴上取点
ty2=[0,-1,-1,0]; %在y轴上取点
plot(tx2,ty2); %绘制图形
axis equal,axis off; %去掉坐标轴
title(' 两个同直径圆管相交的侧视图'); %添加标题
运行结果如图3所示。
图3 两个同直径圆管相交的侧视图图形
例2,mesh和plot是三度空间立体绘图的基本命令,mesh可画出立体网状图,plot则可画出立体曲面图,两者产生的图形都会依高度而有不同颜色。下列命令可画出由函数形成的立体网状图:
x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x, y); % xx和yy都是25x25的矩阵
zz=xx.*exp(-xx.^2-yy.^2); % 计算函数值,zz也是21x21的矩阵
mesh(xx, yy, zz); % 画出立体网状图
立体曲面图:
x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x, y); % xx和yy都是25x25的矩阵
zz=xx.*exp(-xx.^2-yy.^2); % 计算函数值,zz也是25x25的矩阵
surf(xx, yy, zz); % 画出立体曲面图
peaks为了方便测试立体绘图,MATLAB提供了一个peaks函数,可产生一个凹凸有致的曲面,包含了三个局部极大点及三个局部极小点,其方程式为:
要画出此函数的最快方法即是直接键入peaks:
peaks
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) - 1/3*exp(-(x+1).^2 - y.^2)
我们亦可对peaks函数取点,再以各种不同方法进行绘图。meshz可将曲面加上围裙:
[x,y,z]=peaks;
meshz(x,y,z);
waterfall可在x方向或y方向产生水流效果:
[x,y,z]=peaks;
waterfall(x,y,z);
下列命令产生在y方向的水流效果:
[x,y,z]=peaks;
waterfall(x',y',z');
meshc同时画出网状图与等高线:
[x,y,z]=peaks;
meshc(x,y,z);
surfc同时画出曲面图与等高线:
[x,y,z]=peaks;
surfc(x,y,z);
contour3画出曲面在三度空间中的等高线:
contour3(peaks, 20);
contour画出曲面等高线在XY平面的投影:
contour(peaks, 20);
例三,螺旋线
1,静态螺旋线
a=0:0.1:20*pi;
h=plot3(a.*cos(a),a.*sin(a),2.*a,'b','linewidth',2);
axis([-50,50,-50,50,0,150]);
grid on
set(h,'erasemode','none','markersize',22);
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('静态螺旋线');
2,圆柱螺旋线
t=0:0.1:10*pi;
x=r.*cos(t);
y=r.*sin(t);
z=t;
plot3(x,y,z,'h','linewidth',2);
grid on
axis('square')
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('圆柱螺旋线')
例三,旋转抛物面
b=0:0.2:2*pi;
[X,Y]=meshgrid(-6:0.1:6);
Z=(X.^2+Y.^2)./4;
meshc(X,Y,Z);
axis('square')
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('旋转抛物面')
或直接用:ezsurfc('(X.^2+Y.^2)./4')
例四,椭圆柱面
load clown
ezsurf('(2*cos(u))','4*sin(u)','v',[0,2*pi,0,2*pi])
view(-105,40) %视角处理
shading interp %灯光处理
colormap(map) %颜色处理
grid on %添加网格线
axis equal %使x,y轴比例一致
xlabel('x轴');ylabel('y轴');zlabel('z轴'); %添加坐标轴说明
title('椭圆柱面') %添加标题
例五,椭圆抛物面
b=0:0.2:2*pi;
[X,Y]=meshgrid(-6:0.1:6);
Z=X.^2./9+Y.^2./4;
meshc(X,Y,Z);
axis('square')
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('椭圆抛物面')
或直接用:ezsurfc('X.^2./9+Y.^2./4')
例六,双叶双曲面
ezsurf('8*tan(u)*cos(v)','8.*tan(u)*sin(v)','2.*sec(u)',[-pi./2,3*pi./2,0,2*pi])
axis equal
grid on
axis square
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('双叶双曲面')
例七、双曲柱面
load clown
ezsurf('2*sec(u)','2*tan(u)','v',[-pi/2,pi/2,-3*pi,3*pi])
hold on %在原来的图上继续作图
ezsurf('2*sec(u)','2*tan(u)','v',[pi/2,3*pi/2,-3*pi,3*pi])
colormap(map)
shading interp
view(-15,30)
axis equal
grid on
axis equal
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('双曲柱面')
例八、双曲抛物面(马鞍面)
[X,Y]=meshgrid(-7:0.1:7);
Z=X.^2./8-Y.^2./6;
meshc(X,Y,Z);
view(85,20)
axis('square')
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('双曲抛物面')
或直接用:ezsurfc('X.^2./8-Y.^2./6')
例九、抛物柱面
[X,Y]=meshgrid(-7:0.1:7);
Z=Y.^2./8;
h=mesh(Z);
rotate(h,[1 0 1],180) %旋转处理
%axis([-8,8,-8,8,-2,6]);
axis('square')
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('抛物柱面')
或直接用:ezsurfc('Y.^2./8')
例十、环面
ezmesh('(5+2*cos(u))*cos(v)','(5+2*cos(u))*sin(v)','2*sin(u)',[0,2*pi,0,2*pi])
axis equal
grid on
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('环面')
例十一、椭球
ezsurfc('(5*cos(u))*sin(v)','(3*sin(u))*sin(v)','4*cos(v)',[0,2*pi,0,2*pi])
axis equal
grid on
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('椭球')
例十二、单叶双曲面
ezsurf('4*sec(u)*cos(v)','2.*sec(u)*sin(v)','3.*tan(u)',[-pi./2,pi./2,0,2*pi])
axis equal
grid on
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('单叶双曲面')
例十三、旋转单叶双曲面
load clown
ezsurf('8*sec(u)*cos(v)','8.*sec(u)*sin(v)','2.*tan(u)',[-pi./2,pi./2,0,2*pi])
colormap(map)
view(-175,30)
%alpha(.2) %透明处理
axis equal
grid on
axis square
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('旋转单叶双曲面')
例十四、圆柱面
subplot(1,2,1)
ezsurf('(2*cos(u))','2*sin(u)','v',[0,2*pi,0,2*pi])
grid on
shading interp
axis equal
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('圆柱面')
subplot(1,2,2)
cylinder(30)
shading interp
axis square
title('调用cylinder函数所得圆柱面')
利用MATLAB语言强大的绘图功能可以精确的绘制出一系列的三维图像。MATLAB提供了一系列的绘图函数,用户不仅不许考虑绘图细节,只需给出一些基本的参数就能得到所需要的图形,这一类函数称为高层绘图函数。除此之外,MATLAB还提供了直接对句柄进行操作的一系列的低层的绘图操作。这类操作将图形的每个元素看做是一个独立的对象,系统给每个对象独立的分配一个句柄,以后可以通过该句柄对改图元素进行操作,而不影响图形的其他部分。高层绘图操作简单明了,方便高效,使用户最常使用的绘图方法,而低层绘图操作控制和表现图形的能力更强,为用户自主绘图创造了条件。其实MATLAB的高层绘图函数都是利用低层绘图函数建立起来的。在绘制此三维图形的过程中,用到了MATLAB的很多强大的功能。
四,课程体会
经过一学期紧张而有序的课程学习,在忙碌之余也得到了颇多的收获。我深深体会到MATLAB语言相对于同类程序语言更方便更简洁易懂,而且,它所具有的强大的功能可以使我们解决很多用其他计算机语言不容易解决的问题。MATLAB提供了一系列的绘图函数,用户不仅不许考虑绘图细节,只需给出一些基本的参数就能得到所需要的图形,这一类函数称为高层绘图函数,这学期学习让我感受颇多,这门语言相对于其他计算机语言而言不仅简单易操作而且它还具备强大的功能,不管你做什么设计只要牵涉到编程,它总会提供一些函数给我们供我们应用。这是我在学习的过程中的一些技巧:
1 编程问题最头疼的不是编程序,而是调程序,所以在你的程序编完之后,一定要进行验证其正确性,你要尽量多的设想你的问题的复杂性,当然,要一步一步复杂,这样才能保证你的程序的适用性很强
2 你把基本的知识看过之后,就需要找一个实际的程序来动手编一下,不要等所有的知识都学好之后再去编程,你要在编程的过程中学习,程序需要什么知识再去补充,编程是一点一点积累的,所以你要需做一些随手笔记什么的。
3 你需要找一本matlab的函数工具词典,就像汉语词典一样,你要尽量多的熟悉matlab自带的函数,及其作用,因为matlab的自带函数特别多,基本上能够满足一般的数据和矩阵的计算,所以基本上不用你自己编函数。这一点对你的程序非常有帮助,可以使你的程序简单,运行效率高,可以节省很多时间。
4 最好找一个熟悉编程的人来辅助你的学习,这就包括很多编程的技巧问题,程序的结构设计问题,对于程序的运行效率非常有帮助。有的时候,你编出来的程序,能够运行,但是耗时太长,也就是说你的程序没有错,但是不适合实际。或者说,对于规模小的问题能够解决,但是规模大一点的问题就需要很长很长的时间,这就需要对程序的结构和算法问题进行改进。
五,.学习matlab心得体会
我觉以下几点对于学好matlab很重要:兴趣、悟性、勤奋、坚持。
兴趣,不知道哪位名人说过“兴趣是最好的老师。”我觉得非常有道理,我曾对于matlab制作很感兴趣,,一个人一旦对某事物有了浓厚的兴趣,就会主动去求知、去探索、去实践,并在求知、探索、实践中产生愉快的情绪和体验。这样才能主动学习,并且学好到精通。悟性,通常人认为指顿悟,慧根,我觉得就是对一个问题不断的思索,将自己的体会和感受融合,获得属于自己的知识。有很多事情、问题,都是可以想明白的。只有不停的想,才能想明白,想透彻。勤奋,一勤天下无难事。从古到今,有多少名人不是有勤奋而得来成功的。现在的年轻人,一代比一代聪明。要不被别人淘汰,要超越别人,只有靠时间堆出来。每天多学一些,多积累一些。学习matlab也一样,想要学会,使用熟练,不花时间练习,写代码,亲自运行调试,是很难掌握好的。
坚持,认准了的事情,就坚持做到底,直到有所收获。事实上,很多人实现不了自己的目标,很大程度上就是少了一种坚持、非要把事情干到底的精神,他们往往浅尝辄止,因此眼睁睁失去了可能到手的成功。光有兴趣,只有三分钟的热情是很难成事的。很多事情的成功取决于踏平坎坷地坚持的毅力。看准了的事情,如果没有百折不挠的坚持,绝难取得成功。看准的事情就不屈不挠地坚持干下去直至成功,才是智者的唯一选择。每一个人都明白所有梦想的实现都需要努力,然而,很多人只所以没有实现心中的梦想,就在于多了空想、犹豫,少了努力坚持。
至于具体方法:
1.多动手写程序、调试
这里有些常见错误提示信息供大家参考
1.Subscript indices must either be real positive integers orlogicals
中文解释:下标索引必须是正整数类型或者逻辑类型
出错原因:在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。注:matlab的语法规定矩阵的索引从 1 开始,这与 C 等编程语言的习惯不一样。
解决办法:自己调试一下程序,把下标为 0 或者负数的地方修正。
2.Undefined function or variable "a"
中文解释:函数或变量 a 没有定义
3.Input argument "x" is undefined
中文解释:输入变量 x 没有定义
4.Matrix dimensions must agree
Inner matrix dimensions must agree
中文解释:矩阵的维数必须一致
出错原因:这是由于运算符(= + - / * 等)两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。matlab通过“.”来区分矩阵运算和元素运算
5.Function definitions are not permitted at the prompt or inscripts
中文解释:不能在命令窗口或者脚本文件中定义函数
出错原因:一旦在命令窗口写 function c = myPlus(a,b),此错误就会出现,因为函数只能定义在 m 文件中
6. 1) X must have one or two columns
2)Vectors must be the samelengths
中文解释:
1. X 必须是 1 或者 2 列
2. 向量长度必须一致
7.One or more output arguments not assigned during call to'...'
中文解释:在调用...函数过程中,一个或多个输出变量没有被赋值
8.??? Error using ==> mpower
Matrix must be square
中文解释:错误使用mpwoer函数,要求矩阵必须是方阵
9.Explicit integral could not be found.
中文解释:显式解没有找到
10.Index exceeds matrix dimensions.
Attempted to access b(3,2); index out of bounds becausesize(b)=.
中文解释:索引超出矩阵的范围
11.In an assignment A(I) =B, the number of elements in B and I must be the same
中文解释:在赋值语句 A(I) = B 中,B 和 I 的元素个数必须相同
12.To RESHAPE the number of elements must not change
中文解释:矩阵变换时,变换前和变换后的总元素不能改变
2.善于利用MATLAB的帮助
一遇到什么问题,通常我的第一反应是:help,就先说说自己对help的一些常用方法吧。
1)命令窗口直接敲“help”,你就可以得到本地机器上matlab的基本的帮助信息。
2)对于某些不是很明确的命令,只知道大体所属范围,譬如说某个工具箱,直接在命令窗口中敲入
Help toolboxname,一帮可以得到本工具箱有关的信息:版本号,函数名等。
3)知道函数名,直接用help funname就可以得到相应的帮助信息。
3.善于向别人学习,多看牛人写的代码并消化
三人行,必有我师,一个人很难什么都精通,取长补短是最快的进步方法。Matlab的File exchange和pudn上都用很多代码,多看看牛人写的代码,了解他们编程技巧和思想,并消化,对于提高自己的编程水平非常有利。
4.时间积累
“冰冻三尺非一日之寒”,学习需要日积月累,多积累一些matlab的技巧,对于编程是很有利的,比如求序列中的极值,下面一些正是小代码体现大智慧的典范!
[参考文献]
[1] 刘卫国.MATLAB程序设计与应用(第二版)[M].北京:高等教育出版社,2006.
展开阅读全文