完整版计算机图形学试验报告文档良心出品
院系: 数学与统计学学院 专业: 信息与计算科学专业 年级: 2013 级 课程名称:计算机图形学 组号:第 35 组 组员: 李铮 秦文志 李丹 指导教师: 2016 年 06 月 05 日 年级 专业 实验时间 实验 名称 2013 级 信息与计算 科学专业 学号 姓名 201321101027 李铮 实验地点 实验 类型 设计型 201321101028 秦文志 201321101029 李丹 9 栋 204 综合型 √ 创新型 2016 年 4 月 26 日 实验一、 直线的扫描转换 实 验 目 的 1)理解在显示器上画图与在纸上画图的本质区别; 2)掌握直线的光栅扫描转换过程; 3)掌握不同算法绘制直线的思路和优缺点。 用基本增量算法和 Bresenham 算法画直线 1)将像素网格表现出来,建立网格坐标系; 2)显示判别式的计算过程和下一点的选择策略; 3)记录生成点的坐标,建议用表的形式; 4)图形生成过程可以重复进行。 DDA 代码: clear close all clc 实 验 要 求 x1=0;y1=0; x2=15;y2=12; 实 验 原 理 figure,line([x1,x2],[y1,y2], Color ,[0 0 1]); length =abs(x2-x1)+1; dx=(x2-x1)/length; dy=(y2-y1)/length; k=dy/dx; x=x1; y=y1; hold on for i=1:length plot(round(x),floor(y+0.5), *r ) x=x+1; y=y+k; end hold off Bresenham 代码: clear close all clc x1=0;y1=0; x2=15;y2=12; figure,line([x1,x2],[y1,y2], Color ,[0 0 1]); length =abs(x2-x1)+1; dx=x2-x1; dy=y2-y1; e=2*dy-dx; x=x1; y=y1; hold on for i=1:length plot(round(x),floor(y+0.5), *r ) if(e=0) y=y+1; e=e-2*dx; end x=x+1; e=e+2*dy; end hold off 实 验 结 果 分 析 Bresenham 法: 实 验 心 得 体 会 成 绩 评 定教师签名: 年月日 年级 专业 实验时间 实验 名称 实 验 目 的 2013 级 信息与计算 科学专业 学号 姓名 201321101027 李铮 实验地点 实验 类型 设计型 201321101028 秦文志 201321101029 李丹 9 栋 204 综合型 √ 创新型 2016 年 5 月 3 日 实验二、 圆弧的扫描转换 1)掌握圆和圆弧的光栅扫描转换过程; 2)掌握不同算法绘制圆弧的技巧和优缺点。 用正负法和 Bresenham 算法画圆弧 1)将像素网格表现出来,建立网格坐标系; 2)显示判别式的计算过程和下一点的选择策略; 3)记录生成点的坐标,建议用表的形式; 4)图形生成过程可以重复进行。 Bresenham 算法: function bresenham(b) x = 0; y = b; d=3-2*b; theta=0:0.01*pi:2*pi; x1=b*cos(theta)+0; y1=b*sin(theta)+0; plot(x1,y1); hold on plot(0,0, b+ ); hold on; while x0 f=f-2*y+1; y=y-1; else f=f+2*x+1; x=x+1; end if(y==0) plot(x,y, * ); plot(-x,-y, * ); plot(-x,y, * ); plot(x,-y, * ); end end hold off; Bresenham 算法: 实 验 结 果 分 析 正负法: 实 验 心 得 体 会 成 绩 评 定教师签名: 年月日 年级 专业 实验时间 实验 名称 2013 级 信息与计算 科学专业 学号 姓名 201321101027 李铮 实验地点 实验 类型 201321101028 秦文志 9 栋 204 设计型综合型 √ 创新型 201321101029 李丹 2016 年 5 月 17 日 实验三、 直线段的裁剪 实 验 目 的 用 Cohen-SutherLand算法和 liang _barsky 算法进行线段裁剪 1)理解裁剪的相关概念 2)掌握直线段的一般裁剪过程; 3)理解并掌握 Cohen-SutherLand 算法的编码思想; 4)理解并掌握 Liang_Barsky算法的参数化裁剪思想; 实 验 要 求 1)将像素网格表现出来,建立网格坐标系; 2)交互输入剪裁线段和裁剪窗口; 3)对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来; 4)裁剪过程可以重复进行。 实 验 原 理 Cohen-SutherLand 算法核心代码: function Lines=Cohen_Sutherland(line,Rectangle) %编码裁剪算法 %line 为线段端点矩阵,共四列,其数据含义如下: % 端点 A x坐标端点 A y坐标端点 B x 坐标端点 B y 坐标 %Rectangle 为窗口边界值,共四个元素,其含义分别为Xwl,Xwr,Ywb,Ywt。 % %首先检测参数是否合法 [row column]=size(line); if column0,1)) Lines=[Lines;[P1,P2]]; finished=true; end %若当前线段处理完成,则退出 if finished break; end %判断是否简弃 test=code(1,:) if ~isempty(find(test0, 1)) finished=true; end if finished break; end %确保 P1 在窗口之外 if isempty(find(code(1,:)0,1)) %交换 P1,P2 的坐标值和编码 PT=P1;P1=P2;P2=PT; PT=code(1,:);code(1,:)=code(2,:);code(2,:)=PT; end %从低位开始找编码值为 1 的地方 D=find(code(1,:)0,1); if D0,1)); else %若线段是斜线,则计算 y 值,x 值变为窗口的左边界或右边界 P1=[Rectangle(D),P1(2)+k*(Rectangle(D)-P1(1))]; end else %此时 P1 位于窗口的上方或下方 if k==inf %若线段是竖直线,则 x 不变,y 变为窗口的上边界或下边界 %且此时 k 不会等于 0,否则线段将处于简弃状态。 P1(2)=Rectangle(D); else %若线段是斜线,则计算 x 值,y 值变为窗口的上边界或下边界。 P1=[P1(1)+(Rectangle(D)-P1(2))/k,Rectangle(D)]; end e