
计算机图形学实验报告(例文)范文.doc
10页计算机图形学实验报告(例文) 计算机图形学实验报告 202202113 38 8 郭佩佩 实验一 建立计图实验环境 1. 实验目的 为了体现面向对象的程序设计思想,本实验采用基于 Visual C 十十集成环境的 MFC 编程方法,从开发 windows 应用程序的角度,来建立一个菜单交互式绘图基本环境,为后续的实验打基础 2. 实验内容 1) 建立菜单交互式绘图基本环境的工程文件 Vcad,运行后如图: 2)在绘图菜单的下拉子菜单下有如下菜单项: 直线 用弹性线方法输入直线的起止点后,调用 bresenham 算法替换原来 的 moveto/lineto 算法画直线 圆/圆弧 在该菜单选择后,可分别画圆或圆弧 直线段裁剪 输入矩形域左上角及右下角后,产生裁剪区域;然后可输入若干条直线段,矩形域作为主裁剪域对其裁剪之 面区填充 输入多边形的若干顶点后,调用面区填充算法对多边形域的内部填充 之 贝塞尔曲线 输入四顶点后,调用三次贝塞尔曲线生成算法生成贝塞尔曲线 实验二 园和园弧的绘制算法 1. 实验目的 通过园和椭圆弧生成算法的上机调试,掌握: 1) VC++图形函数的使用方法; 2) 圆和椭圆弧的生成原理。
2.实验内容 1)以函数形式编写圆的生成算法,然后在 VCAD 绘图小系统中的绘图 圆子菜单下找到合适的程序修改点,将本实验要求你编写的画圆算法插入工程文件中,通过调试来验证你编写的画圆算法的正确性 2) 以函数形式编写角度 DDA 椭圆弧生成算法,然后在 VCAD 绘图小系统中的绘图 圆弧子菜单下找到合适的程序修改点,将本实验要求你编写的画圆弧算法插入工程文件中,通过调试来验证你编写的画圆弧算法的正确性 Arc(int xc,int yc,doubli r,double ts,double te) { double rad,ts1,tel,deg,dte,ta,ct,st; int x,y,n,I; rad=0.0174533; tsl=ts*rad; tel=te*rad; if(r5.08) deg=0.015; else if(r7.62) deg=0.06; else if(r25.4) deg=0.075; else deg=0.15; dte=deg*25.4/r; if(teltsl) tel+=6.28319; n=(int)((tel-tsl)/dte+0.5); if(n==0) n=(int)(6.28319/dte+0.5); ta=tsl; x=xc+r*cos(tsl); y=yc+r*sin(tsl); moveto(x,y); for(i=1;i=n;i+++) { ta+=dte; ct=cos(ta); st=sin(ta); x=xc+r*ct; y=yc+r*st; lineto(x,y); } x=xc+r*cos(tel); y=yc+r*sin(tel); lineto(x,y); return(0); } 实验三 直线的裁剪( 编码裁剪算法) 1. 实验目的 通过编码裁剪算法的设计与调试,了解二维线段的裁剪过程,提高程序设计能力与上机调试能力,达到理论与实践有机结合之目的。
注:此实验已有可运行的中点裁剪算法作为参考实例,做实验时,可将中点裁剪算法替换为你编写的编码裁剪算法 2. 实验内容 1) 以函数形式编写编码裁剪算法及相关子算法; Var xl,xr,yb,yt:real; procedure clip(x1,y1,x2,y2:real); label:return; type edge=(L,R,B,T); outcode=set of edge; Var c,c1,c2:outcode;x,y:real; Procedure code(x,y:real;Var c:outcode); Begin c:=[ ]; If xxl then c:=[L] Else if x>xr then c:=[R]; If yyb then c:=c+[B] Else if y>yt then c:=c+[T]; End {end of code} Begin {main} Code(x1,y1,c1);code(x2,y2,c2); While (c1>[]) or (c2>[]) do Begin if c1*c2>[] then return;{显然不可见} c:=c1;if c=[] then c:=c2; If L in c then begin x:=xl;y:=end;{对左边界求交} If R in c then begin x:=xr;y:=end; {对右边界求交} If B in c then begin x:=;y:=yb end; {对底边界求交} If T in c then begin x:=;y:=yt end; {对顶边界求交} If c=c1 then begin x1:=x;y1:=y; code(x,y,c1) end Else begig x2:=x,y2:=y; code(x,y,c2) end End;{End of while} Line(x1,y1,x2,y2); Return: end; {end of clip} 2) 交互产生矩形裁剪框,并输入不同斜率的直线段的始、终点,先画出此直线段,然后调用裁剪算法,画出裁剪后保留的可见线段部分。
3) 在 VCAD 绘图小系统中的绘图 直线裁剪子菜单下找到合适的修改点,将本实验要求你编写的编码裁剪算法替换掉工程文件中的中点裁剪算法,通过调试来验证你编写的编码裁剪算法的正确性 实验四 面区填充(Y-X 算法) 1. 实验目的 通过 Y-X 面区填充算法的调试,掌握: 1) 多边形面区填充算法的数据组织; 2) 利用相关性提高算法效率; 3) 奇异点的处理方法; 4) 提高程序设计能力 2. 实验内容 1) 以函数形式编写 Y-X 面区填充算法; 2) 在 VCAD 绘图小系统中的绘图 面区填充子菜单下找到合适的修改点,将本实验要求你编写的面区填充算法插入工程文件中,通过调试来验证你编写的面区填充算法的正确性操作时,用鼠标交互给出多边形的若干顶点,画出此多边形,然后调用你编写的 Y-X 面区填充算法填充,以自选的颜色填充多边形 实验五 贝塞尔曲线生成算法的设计与调试 一、实验目的 在掌握曲线、曲面数学理论的基础上,通过调试,绘制 Bezier 曲线加深同学 对数学理论的理解通过二条 Bezier 曲线的拼接设计,掌握自由曲线的拟合方法。
二、内容和要求 3 1、由三次 Bezier 曲线的公式:P(t)=∑P i B i,3 (t) 出发,编写生成 Bezier i=0 曲线的程序,要求如下: a) 用鼠标输入特征多边形的四点然后调用 Bezier 曲线生成算法绘出曲线 b) 重复上步 34 遍,验证你编写的算法的正确性 typedef cptype float[4][4]; float cc (int n,int i) //计算 n!/(i!(n-i)!) {int j; float a; a=1; for(j=i+1;j=n;j++) a*=j; for(j=2;j=n-i;j++) a/=j; return a; } float b_lend(Int i,int n,float t2) //计算 B i,n (t) {float v; v=cc(n,i); for(j= 1;j=i;j++) v*=t2; for(j=1;j=n-i;j++) v*=(1-t2); return v; } void bezier(float x0,float y0,float z0,float t0,int n,cptype cp2)//给定 t0,计算 f(t0) {int i; float b1,g; for(i=0;i=n;i++) {b1=b_lend(i,n,t0); x0=x0+cp2[i,1]*b1; y0=y0+cp2[i,2]*b1; z0=z0+cp2[i,3]*b1; }} void draw_curv(int k,cptype cp1)//将 t 分成 k 等份,循环迭代,绘出曲线。
{int i,j,x1,y1,z1; float x,y,z,delt; delt=1.0/k; t=0; for(i=1;i=k;i++) {x=y=z=0; bezier(x,y,z,t,3,cp1); if(t==0) moveto(x,y); else lineto(x,y); t+=delt; }} 2、将特征多边形改为五个控制点,修改程序后绘出四次曲线 3、实现二条三次 Bezier 的拼接,并使连接点处保持一阶连续 实验小结: 实验的过程是辛苦的,特别是处理大量的数据,大量的临时变量,很容易出错,需要极大的耐心一些计算时,例如DDA 算法画圆时,需要强制类型转换一些数据,因为遗漏导致程序出了许多奇怪的错误,调试很久才发现另外,贝塞尔曲线的算法编写中,一些数学函数的调用也很复杂,因为不常用,所以经常翻阅 API 文档 最困难的是因为对该图形系统的不熟悉,导致处理鼠标操作时遇到一些难题,仔细比对才得以解决 通过本次实验,对整个图形系统有了比较透彻的了解,同时对一些数学函数的使用再次加深了印象,更重要的是掌握了许多实用的计算机图形学的算法,对 MFC 的使用有了很大提升。
这次实验中积累的经验在今后的软件开发中将使我受益匪浅 2022 年 1 月 3 日 10。
