1、计算机图形学课程设计报告学 生 姓 名 : 学 号:学 院 : 班 级 : 题 目 : 简单图形的绘制指导教师: 职称: 2015 年 7 月 1 日-I-目 录目 录 .I一、选题背景 .1二、算法设计 .22.1 绘制直线、圆、椭圆、抛物线 22.1.1 绘制直线 22.1.2 绘制圆 22.1.3 绘制椭圆 22.1.4 绘制抛物线 22.2 三维几何变换 .2三、程序及功能说明 .53.1 绘制直线、圆、椭圆、抛物线 .53.1.1 绘制直线 53.1.2 绘制圆 53.1.3 绘制椭圆 53.1.4 绘制抛物线 63.2 图形的平移 .63.3 图形的旋转 63.4 图形的缩放 7四
2、、结果分析 .74.1 绘制直线、圆、椭圆、抛物线 .74.1.1 直线 74.1.2 圆 8II4.1.3 椭圆 84.1.4 抛物线 84.2 图形的平移 94.3 图形的旋转 104.4 图形的缩放 11五、总 结 .13六、课程设计心得体会 .14参考文献 .15源程序 .16-1-一、选题背景-2-二、算法设计2.1 绘制直线、圆、椭圆、抛物线2.1.1 绘制直线通过两个点的坐标来绘制直线。计算机图形学中二维图形在显示输出之前需要扫描转换,生成直线的算法一般有 DDA 算法和中点算法。2.1.2 绘制圆通过运用圆的参数方程 来绘制圆的图形,其cos;sinxarybr中 , (a,b
3、 )为圆心, r 为半径,运用参数方程,只需要确定半径的0,2长度和圆心的位置,即可绘制出圆。2.1.3 绘制椭圆通过运用椭圆的参数方程 来绘制椭圆的图形,其中cos;inxayb,是已知的变量,a,b 分别为长半轴,短半轴,当确定 a 和 b 后,0,2通过参数方程即可得到这个椭圆的方程。2.1.4 绘制抛物线根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。2.2 三维几何变换三维几何变换是二维几何变换的推广。二维几何变换在
4、齐次坐标空间中可用 3 3 的变换矩阵表示,类似的,三维几何变换在齐次坐标空间中可用 4 4 的变换矩阵表示。三维空间中的点 的齐次坐标定义为,xyz,其中, 为不等与零的任意常数,,hxyzh, , 。亦即点 对应 4 维齐次坐标空间的一条直hyz,线:-3-(2.2.1)hhxyzw通常为了简单起见,取 为 的齐次坐标。,1xy,xy(1)平移变换平移变换将点 在三个坐标轴方向上分别移动距离 ,得,Pz ,xyzt到新的一点 ,它们之间的关系表示为: ,其中 xy PT。,Txyzt三维平移变换在其次坐标下的矩阵表示为:(2.2.2),10xyz xyt ztTt(2)放缩变换三维放缩变换
5、在齐次坐标下的矩阵表示:(2.2.3),01xyzxys zsS此变换的参照点为坐标原点,我们可以按下面步骤建立关于空间任一参照点 的缩放变换:,rrPxyz(1)平移使 落于原点,变换为 ;,rrTxyz(2)进行放缩变换 ;,xyzSs(3)平移 回到原先的位置,变换为 。rP,rrz从而关于参照点 的缩放变换 为;rPxy(2.2.4);,rrr zrrSxyzTxyzSsTxyzA(3)旋转变换-4-给定一点 ,首先将 点 和 坐标表示成极坐标,即,PxyzPyz,其中 。将 点绕 轴旋转 角后,得到,cosinxyzr2rPx。易知:(2.2.5)cosinxyrz上式矩阵形式为:(
6、2.2.6)10cosinixxyyzz从而绕 轴旋转 角的变换在齐次坐标下的矩阵表示为:x(2.2.7)100cosin1xR类似的,绕 轴和 轴的旋转 的变换矩阵分别为:yz(2.2.8)cos0sin1icyR(2.2.9)osin0ic01zR如果要绕空间任意轴 旋转 角,可按如下步骤实现:01P(1)以 为原点 , 为 轴建立新的坐标系 ;0OzOxyz(2)求出从坐标系 到坐标系 的变换 ;xyxyM(3)将图形对象变换到坐标系 中;z(4)在新坐标系 中绕 轴旋转 角,变换为 ;zzR-5-(5)将图形对象变换为原坐标系 中,变换为 。Oxyz1M这样绕 旋转 角的变换为:01P
7、(2.2.10)1zMR三、程序及功能说明3.1 绘制直线、圆、椭圆、抛物线3.1.1 绘制直线plot(A,B)通过运用 matlab 中的 plot 函数画出两点之间的直线图像。其中 A,B 为直线上的两个点的坐标,通过两点绘制直线。3.1.2 绘制圆function circle(A,R)alpha=0:pi/50:2*pi;%角度 0,2*pi %R=2;%半径 x=R*cos(alpha)+A(1); y=R*sin(alpha)+A(2); plot(x,y,-) axis equal首先先对角度 alpha 分割成小区间,且求出相应的 cos 和 sin 值,再根据输入的半径和圆
8、心坐标 A,带入公式求得圆上的点的坐标,再绘制出图像。3.1.3 绘制椭圆function tuocircle(a,b)t=0:pi/20:2*pi; x=a*cos(t); y=b*sin(t); plot(x,y)首先先对角度 t 分割成小区间得出相应的 cos 和 sin 值,根据再根据输入的长半轴 a 与短半轴 b 完善参数方程求得椭圆上的点的坐标,再绘制出图像。-6-3.1.4 绘制抛物线function parabola(A,B,C)x=A(1) B(1) C(1); y=A(2) B(2) C(2); %y=ax2+b p=polyfit(x,y,2); t=-10:.1:10;
9、%指定绘图区间 s=polyval(p,t); plot(t,s,x,y,or)通过三个点绘制抛物线是通过三点的拟合绘制出图像;通过函数是在一个区间上画出函数图像。3.2 图形的平移function change(T1,V1)中:T=1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1;T(1,4)=T1(1); T(2,4)=T1(2); T(3,4)=T1(3);ALL=T %最后的变换矩阵V2=ALL*V1;V=V2;先设 T 为平移变换矩阵,然后通过带入平移的长度,形成最终的平移矩阵,成为最重的变换举证 ALL,将 ALL 左乘须变换矩阵 V1,最终得到变换后的图形矩阵 V。
10、3.3 图形的旋转function change2(R1,V1)R=0 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1;sina=sin(R1); cosa=cos(R1);R(1,1)=cosa; R(1,2)=-sina; R(2,1)=sina; R(2,2)=cosa;ALL=R %最后的变换矩阵V2=ALL*V1;V=V2;-7-先设 R 为旋转变换矩阵,首先就将带入的角度求出 sina 和 cosa 值,然后对应公式将值带入矩阵的对应位置形成最终的旋转矩阵,成为最终的变换矩阵 ALL,将 ALL 左乘须变换矩阵 V1,最终得到变换后的图形矩阵 V。3.4 图形的缩放fu
11、nction change3(S1,V1)S=0 0 0 0;0 0 0 0;0 0 0 0;0 0 0 1;S(1,1)=S1(1); S(2,2)=S1(2); S(3,3)=S1(3);ALL=S V2=ALL*V1;V=V2;将 S 设为缩放变换矩阵,然后对应公式将缩放的值带入矩阵的对应位置形成最终的平移矩阵,成为最终的变换矩阵 ALL,将 ALL 左乘须变换矩阵V1,最终得到变换后的图形矩阵 V。四、结果分析4.1 绘制直线、圆、椭圆、抛物线4.1.1 直线1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 211.11.21.31.41.51.61.71.8
12、1.92 line(1 2,2 1)-8-4.1.2 圆-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.511.522.533.544.55 circle(2 3,2)4.1.3 椭圆-30 -20 -10 0 10 20 30-0.8-0.6-0.4-0.200.20.40.60.8 tuocircle(30,0.7)4.1.4 抛物线根据三个点画出抛物线:-9-10 -5 0 5 10 15-250-200-150-100-50050 parabola(1 2,5 6,3 9)根据函数画抛物线:-5 -4 -3 -2 -1 0 1 2 3 4 50102030405060
13、70804.2 图形的平移 showCubic(0,0,1,1;1,0,1,1;1,1,1,1;0,1,1,1;0,0,0,1;1,0,0,1;1,1,0,1;0,1,0,1) change(4,5,6,0,0,1,1;1,0,1,1;1,1,1,1;0,1,1,1;0,0,0,1;1,0,0,1;1,1,0,1;0,1,0,1)平移矩阵: 10456T最终总变换矩阵:-10-10456AL变换后的矩阵: 457164516V0 2 40246012345674.3 图形的旋转 showCubic(0,0,1,1;1,0,1,1;1,1,1,1;0,1,1,1;0,0,0,1;1,0,0,1;
14、1,1,0,1;0,1,0,1) change2(pi/3,0,0,1,1;1,0,1,1;1,1,1,1;0,1,1,1;0,0,0,1;1,0,0,1;1,1,0,1;0,1,0,1)旋转矩阵: 0.5.86001R 最终变换矩阵:-11-0.5.86001AL 变换后的矩阵: 01.05.86300.1.0.5.8631V -0.500.5100.5100.20.40.60.814.4 图形的缩放00.20.40.60.800.10.20.30.400.10.20.3 showCubic(0,0,1,1;1,0,1,1;1,1,1,1;0,1,1,1;0,0,0,1;1,0,0,1;1,
15、1,0,1;0,1,0,1) change3(0.8,0.5,0.3,0,0,1,1;1,0,1,1;1,1,1,1;0,1,1,1;0,0,0,1;1,0,0,1;1,1,0,1;0,1,0,1)缩放矩阵:-12-0.80.5.31.S 最终变换矩阵: 0.80.5.31.AL 变换后矩阵: 00.3.0.81.5000.81.5V 缩放前图形:00.5100.5100.20.40.60.81缩放后图形:-13-00.20.40.60.800.10.20.30.400.10.20.3五、总 结这次的课程设计主要是运用软件 matlb 来实现的。这次对简单图形的绘制,如:直线、抛物线、圆、椭圆
16、等,还有对图形进行平移、旋转、缩放操作。简单图形的绘制,主要是通过编写 matlab 命令来实现,对于平移、旋转、缩放主要是对应的矩阵要是四维的,然后对应矩阵的分量调整好,再按照倒序相乘,得出变换矩阵,最后与原来的图形矩阵相乘后得出新的矩阵。所以这次的课程设计是按照书上的算法步骤先求出矩阵,然后求出变换后的图像的矩阵,因为需要变成其次坐标,所以需要添加一个最后的分量 1,这样各种矩阵的运算才可以实现。刚开始对这个地方不懂,编程出现了很多错误。对于题目要求:在图形显示中,使用鼠标、键盘或下拉菜单等方式进行交互控制。这个地方,我们通过在 matlab 调用命令来实现对图形的平移、旋转、缩放等操作。
17、-14-六、课程设计心得体会这个学期学了计算机图形学后,对我们有了很多帮助。老师讲解的非常详细,也举了很多生动的例子。所以对图形学的研究内容、应用、发展简历等。平时也通过课内实验对所学的内容通过编程实现各个功能,这让我们积累了一定的编程能力,同时对 matlab 也能更好的运用。本课程主要内容包括直线、圆、椭圆、抛物线等简单图形的绘制;交互的对简单图形进行平行;能够交互式的对简单图形进行旋转。这次对图形进行平移、旋转、缩放的操作,主要是对应的矩阵要是四维的,然后对应矩阵的分量调整好,再按照倒序相乘,得出变换矩阵,最后与原来的图形矩阵相乘后得出新的矩阵。通过这次的课程设计,使我们的自学能力与动手
18、实践能力得到相当大的提高,编程并不是靠看书本就能学会的,而是要靠一步步的调试一条条指令的修改试运行中学习进步的,盲目的看书并不能提高自己水平。这次的课程设计就是按照书上的步骤求矩阵,然后求出变换后的图像的矩阵,因为需要变成其次坐标,所以需要添加一个最后的分量 1,这样各种矩阵的运算才可以实现。在本次的课设中让我们对计算机图形学有了一个更加深我们对计算机图形学课程理论知识的认识和理解,使我找到了理论与实践的最佳结合点。以前可能只是简单的了解记住课本一些原理,通过自己编写程序将理论付诸实践后。那些知识更加使我真正明白并深记着,尤其能找到一些以前会忽略的细节。在运用 matlab 编写程序的时候,首
19、先对图形的旋转、平移、缩放的原理有了深入的学习和认识,然后,在编写程序的时候从分考虑算法,用最简单的方法实现题目要求。题目中要求交互式的实现功能,但是我们直接运用 matlab 用命令实现了题目要求。通过这次课程设计,我们学会了团队合作,也更加明白了团队合作的效率和意义,让我们认识到一起学习并完成一项任务的意义。从这次的课程设计我们知道了自己的不足,学习的知识不够充分,对于现有资源材料的利用学习率太低等方面的缺点,对今后的学习和工作进步都有非常大的帮助。15参考文献1倪明田,吴良芝.计算机图形学M北京:北京大学出版社, 1999.2孔令德. 计算机图形学课程设计教程M北京:北京大学出版社, 2
20、010.3白建军OpenGL 三维图形设计与制作M北京:人民邮电出版社, 1998.16源程序1绘制直线function line(A,B)plot(A,B)2绘制圆function circle(R)alpha=0:pi/50:2*pi;%角度0,2*pi %R=2;%半径 x=R*cos(alpha); y=R*sin(alpha); plot(x,y,-) axis equal3绘制椭圆function tuocircle(a,b)t=0:pi/20:2*pi; x=a*cos(t); y=b*sin(t); plot(x,y)4根据三点绘制抛物线function parabola(A,
21、B,C)%A=1 2; %B=5 6; %C=3 9; x=A(1) B(1) C(1); y=A(2) B(2) C(2); %y=ax2+b p=polyfit(x,y,2); t=-10:.1:10;%指定绘图区间 s=polyval(p,t); plot(t,s,x,y,or)5根据函数绘制抛物线x=0:0.1:10;y=3*x.2plot(x,y)6图形的平移变换function change(T1,V1)T=1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1;T(1,4)=T1(1);T(2,4)=T1(2);T(3,4)=T1(3);T%平移 ALL=T %最后的变换
22、矩阵V2=ALL*V1;V=V2;V%变换后的图形矩阵,下面画图 face = V(1:4,:); %1,2,3,4fill3(face(:,1),face(:,2),face(:,3),r);hold on; -17-face = V(5:8,:); %5,6,7,8fill3(face(:,1),face(:,2),face(:,3),b);hold on; face = V(2:3,:); V(7,:);V(6,:) %2,3,7,6fill3(face(:,1),face(:,2),face(:,3),g);hold on; face = V(1,:);V(4,:);V(8,:);V(
23、5,:); %1,4,8,5fill3(face(:,1),face(:,2),face(:,3),y);hold on; face = V(7:8,:); V(4,:);V(3,:) %4,3,7,8fill3(face(:,1),face(:,2),face(:,3),b);hold on; face = V(1,:);V(2,:);V(6,:);V(5,:); %1,2,6,5fill3(face(:,1),face(:,2),face(:,3),r);axis equal7图形的旋转变换function change2(R1,V1)R=0 0 0 0;0 1 0 0;0 0 1 0;0
24、 0 0 1;sina=sin(R1);cosa=cos(R1);R(1,1)=cosa;R(1,2)=-sina;R(2,1)=sina;R(2,2)=cosa;R%旋转 ALL=R %最后的变换矩阵V2=ALL*V1;V=V2;V%变换后的图形矩阵,下面画图 face = V(1:4,:); %1,2,3,4fill3(face(:,1),face(:,2),face(:,3),r);hold on; face = V(5:8,:); %5,6,7,8fill3(face(:,1),face(:,2),face(:,3),b);hold on; face = V(2:3,:); V(7,:
25、);V(6,:) %2,3,7,6fill3(face(:,1),face(:,2),face(:,3),g);hold on; face = V(1,:);V(4,:);V(8,:);V(5,:); %1,4,8,5fill3(face(:,1),face(:,2),face(:,3),y);hold on; face = V(7:8,:); V(4,:);V(3,:) %4,3,7,8fill3(face(:,1),face(:,2),face(:,3),b);hold on; face = V(1,:);V(2,:);V(6,:);V(5,:); %1,2,6,5fill3(face(:
26、,1),face(:,2),face(:,3),r);axis equal8图形的缩放变换function change3(S1,V1)S=0 0 0 0;0 0 0 0;0 0 0 0;0 0 0 1;S(1,1)=S1(1);S(2,2)=S1(2);-18-S(3,3)=S1(3);S%缩放ALL=S %最后的变换矩阵V2=ALL*V1;V=V2;V%变换后的图形矩阵,下面画图 face = V(1:4,:); %1,2,3,4fill3(face(:,1),face(:,2),face(:,3),r);hold on; face = V(5:8,:); %5,6,7,8fill3(fa
27、ce(:,1),face(:,2),face(:,3),b);hold on; face = V(2:3,:); V(7,:);V(6,:) %2,3,7,6fill3(face(:,1),face(:,2),face(:,3),g);hold on; face = V(1,:);V(4,:);V(8,:);V(5,:); %1,4,8,5fill3(face(:,1),face(:,2),face(:,3),y);hold on; face = V(7:8,:); V(4,:);V(3,:) %4,3,7,8fill3(face(:,1),face(:,2),face(:,3),b);hold on; face = V(1,:);V(2,:);V(6,:);V(5,:); %1,2,6,5fill3(face(:,1),face(:,2),face(:,3),r);axis equ16