资源描述:
《计算机图形学实验1报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、设计和实现一个图形函数库一、实验要求设计和实现一个图形函数库,具有绘制直线段、任意圆弧、椭圆弧、多边形区域的阴影填充和颜色填充等功能。(仅调用画点函数)WindowsAPI:setpixel(hdc,x,y,color)二、实验平台编程环境:VisualStudio2008编程语言:C#操作系统:Windows7三、实验目的在理解画直线段,圆弧,椭圆,多边形的画法,以及阴影填充和颜色填充算法的基础上,编程实现出一个简单的画图工具,加深对个算法的理解。四、算法基本原理1、画直线段(1)算法思想木程序采用Bresenham直线算法,基木思想为:(以斜率在0〜1之间的直线段为例)这种情况下,选
2、择X方向为计长方向,即增量妇1。如图3.2所示,设pi(",yZ)是已选定的离直线最近的像素,现在耍决定pi+l是T还是So显然,若〃VO・5,则S比较靠近直线,应选S;若d>=0・5,则应选T。(m二Ay/Ax)令e=d・0.5(初值为-0.5),即有:幺<0时,选Pi+l(xZ+l,yi更新e-e+m;w>=0时,选Pi+1("+1,yj+1),更新e=e+m-l(2)算法流程(3)实现效果2、画(1)算法思想本程序采用Bresenham圆弧算法,基本思想为:与Bresenham直线生成算法一样,其基本方法是从一个起点出发,利用判别式选择下一个显示点。判别式的值通过简单计算获得,
3、其符号用作判断。此算法在每一步都选择一个离开理想圆周最近的点pi(xZ,yi使其误差项ID(Pi)
4、=
5、xZ2+y?2-R2
6、^每一步都是极小值。设Pi-l(xZ-7,被选定为最靠近圆弧的点,下一步口+1时,要决定T还是S更接近理想的圆弧,令d(s)=(x/-7+i)2+(>7-7)2-R2d(t)=(xz-7+i)24-(>7-7-i)2-r2显然,
7、D⑸
8、>=
9、D(T)
10、时,应该取T点;反之则取S点(2)算法流程▼3、画椭圆弧(1)算法思想椭圆生成算法与圆形生成算法类似,都是先生成八分之一圆弧,然后根据对称原则牛•成图形,所不同的是椭圆有长轴和短轴之分,故需要提前求出45。方向椭圆
11、焦点的坐标。然后再根据公式进行画点。(2)程序流程Sjnrti;sZk+Mi;FLs-GiiLl①5r(FMithSMrtI)6h^shifLpCintl仇5-1kwOSjl/MiiLS^ni'^L.ut>Sjs^SJii;•;x-0;ftCx>y>HMM他三卜対标点術点r*二#2e*5c+洒(仃Wi1);d-=4*Sb*i2*5c+叶;4、画多边形(1)算法思想多边形画法是基于直线画法实现的,笫一次点击确定第一个点,第二次点击画出第一条直线,之后每次点击都已上一次点击为起点这次点击为终点画线,直到结束。(2)程序流程5、颜色填充(1)算法思想本程序可以由用户选择填充颜色,可对闭合图形内
12、部进行填充,采用漫水法,进行递归画点。漫水法基本原理:Procedureflood・fill・4(x”old・color;new-color:integer)beginifgetpixel(framebuffer,x,y)=old-colorthenbeginsetpixel(framebuffer,x,y,newcolor);flood・fill・4(x,y+l,old・color,new-color);flood-fill-4(x,y-lzold-color,new-color);flood-fill-4(x-l;y,old-color,new-color);flood・fill・4
13、(x・l.y-^old-color,new-color);endend(2)实现效果6、阴影填充(1)算法思想本程序使用的填充线的斜率为在任意闭合图形内点击,程序先填充点击点左下部分,后填充点击点右上部分。五、实验总结通过本次实验,我对基本图形的画法有了一定的了解,将课上的算法真正实践岀来。并对算法进行了一定的修改和补充。在实验的同时,熟悉了C#的编程思想,通过上网查资料和与同学讨论,使我的编程水平有了一定的提高。六、源程序清单usingSystem;usingSystem・Collections・Generic;usingSystem・ComponontModel:usingSyste
14、m.Data;usingSystem.Drawing;usingSystem・Linq;usingSystem.Text;usingSystem・Windows.Forms;ntimespace简单画图板publicpartialclassForml:Form{privateBitmapbitmap;privatePenpen二newPen(Color.Black);privateintchoice=0;privateSolidBr