
Dos界面计算机图形学画图.doc
12页1计算机图形学大作业报告课程名称: 计算机图形学 姓 名: 陶向东 学 号: 100511726 组 员: 任课教师: 贾瑜 成 绩: 21引言引言 1.11.1 编写目的编写目的本学期计算机图形学课程期末大作业主要的开发项目就是基于DOS的基本 图形的绘制、填充、变换,以及直线的裁剪实现语言VC++,编辑、调试环境 VC++6.0此次大作业的完成是对计算机图形学基础知识的检验和测试,在撰 写报告的过程中我能够更深刻地了解计算机图形学算法的思想,通过这份文档 来记录我们在开发此软件的过程中遇到的问题以及改善的方法现在对整个开 发过程加以认识、记录和总结,留下经验,汲取教训为以后的其他工作留下 经验资料,为以后遇到相同的问题和从事类似项目奠定坚实的基础。
1.21.2 任务分工任务分工陶向东:实现直线、正三角形、矩形、椭圆的绘制,图形的边界标识填充算法, 实现直线的裁剪算法2 程序框架程序框架2.12.1 程序模块程序模块本系统是一个基于 DOS 开发的实现能够基本图形的绘制、填充、变换,以 及直线的裁剪的系统本系统中的功能模块主要分为以下几种: 基本图形绘制模块:实现直线、矩形、圆、椭圆的绘制功能基本图形填充模块:实现矩形的填充功能基本图形裁剪模块:实现直线的裁剪功能程序框架如图 2-1 所示3图图 2-12-1 程序框架图程序框架图2.22.2程序功能接口程序功能接口接口名称:void drawLine(int xs,int ys,int xe,int ye,int value); 功能说明:实现正负法画直线 参数说明:xs,ys:起点坐标; xe,ye:终点坐标; value:画线颜色接口名称:void drawCircle(int x0,int y0,int r,int value); 功能说明:实现正负法画圆 参数说明:x0,y0:圆心坐标; r:半径; value:画圆颜色接口名称:void drawRectangle(int x0,int y0,int x1,int y1,int value); 功能说明:实现画矩形。
参数说明:x0,y0:矩形其中一个点的坐标;4x1,y1:矩形对角点的坐标; value:画线颜色接口名称:void drawTriangle(int x0,int y0,int x1,int y1,int x2,int y2,int value); 功能说明:实现画三角形 参数说明:x0,y0:三角形第一个点的坐标;x1,y1:三角形第二个点的坐标;x2,y2:三角形第三个点的坐标;value:画线颜色接口名称:void midellipse(int x,int y,int color); 功能说明:实现画椭圆 参数说明:x,y:椭圆中点坐标; color:画线颜色接口名称:void drawshape(); 功能说明:画填充图形 参数说明:无接口名称:void edgemark_fill(); 功能说明:图形填充 参数说明:无接口名称:initialize( ); 功能说明:初始化界面 参数说明:无接口名称:void encode(int x,int y,int *code) 功能说明:给被裁剪图形编码 参数说明:int x:图形位置的横坐标; int y:图形位置的纵坐标; int *code:记录点的位置。
接口名称:void draw_ett(); 功能说明:实现图形裁剪 参数说明:无接口名称:void void chosenum(); 功能说明:提示选择功能 参数说明:无接口名称:void CirclePoints(int x0,int y0,int x,int y,int value); 功能说明:存储下一个圆上的点5参数说明:x0,y0:第一个点的坐标;x,y:圆点坐标;value:画线颜色3主要算法描述主要算法描述3.13.1边界标识法填充边界标识法填充扫描线具有连贯性,这种连贯性只有在扫描线与多边形相交处才会发生变化,而每次的变化结果:无非是在前景色和背景色之间相互“切换”边标志填充算法正是基于这一发现,先在屏幕上生成多边形轮廓线,然后逐条扫描处理处理中:逐点读取象素值,若为边界色,则对该象素值进行颜色切换1、用边界色画出多边形轮廓线,也就是将多边形边界所经过的象素打上边标志2、为了缩小范围,加快填充速度,须找出多边形的最小包围盒:xmin、ymin、xmax、ymax如下图所示图 3.1.1 边标志填充算法3、逐条扫描线进行处理,对每条扫描线依从左往右的顺序,逐个访问该扫描线上的象素。
每遇到边界象素,标志取反然后,按照标志是否为真,决定象素是否为填充色3.23.2正负法画圆正负法画圆现以下图的 AB 弧为例,来说明正负画圆法(顺时针生成圆)6图 3.2.1 正负法画圆假设当前点为 Pi(xi,yi),取下一个点 Pi+1(xi+1,yi+1)的原则是: 1、当 F(xi,yi)≤0 时:取 xi+1= xi+1,yi+1= yi即向右右走一步,从圆内走向圆外对应图(a)中的从 Pi到 Pi+12、当 F(xi,yi)>0 时:取 xi+1= xi,yi+1= yi-1即向下下走一步,从圆外走向圆内对应图(b)中的从 Pi到 Pi+1由于向圆内或向圆外走取决于 F(xi,yi)的正负,因此称为正负法下面分两种情况求出 F(xi,yi)的递推公式:(1) 当 F(xi,yi)≤0 时,向右走,取 xi+1=xi+1,yi+1=yi,则F(xi+1,yi+1) =F(xi+1,yi)=(xi+1)2+yi2-R2=(xi2+yi2-R2)+2xi+1 (3.2.1)= F(xi,yi)+2xi+1(2) 当 F(xi,yi)>0 时,向下走,取 xi+1=xi,yi+1=yi-1,则F(xi+1,yi+1) =F(xi,yi-1)=xi2+(yi-1)2-R2=(xi2+yi2-R2)-2yi+1 (3.2.2)= F(xi,yi)-2yi+1初始时,x=0,y=R,故 F(0,R)=(02+R2)-R2=0 (3.2.3)公式(3.2.1)、(3.2.2)和(3.2.3)就构成正负画圆算法的核心。
给象素坐标(x,y)及 F 赋初始值后,进入循环画点;画点后,根据 F 的符号进行 F 值的递推和下一个点的获取,直到 x>y 为止同前面介绍的一样,利用圆的八分对称性,循环一次,画八个点73.33.3SutherlandSutherland 裁剪算法裁剪算法3.3.1 Sutherland 多边形裁剪算法思想该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形) 当多边形一个顶点 Pi 相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则):1、顶点 Pi 在内侧,前一顶点 Pi-1 也在内侧,则将 Pi 纳入新的顶点序列;2、顶点 Pi 在内侧,前一顶点 Pi-1 在外侧,则先求交点 Q,再将 Q、Pi 依次纳入新的顶点序列;3、顶点 Pi 在外侧,前一顶点 Pi-1 在内侧,则先求交点 Q,再将 Q 纳入新的顶点序列;4、顶点 Pi 与前一顶点 Pi-1 均在外侧,则顶点序列中不增加新的顶点。
3.3.2 点在边界内侧的判断方法为了判断点是否在边界内侧可用坐标比较法和更通用的向量叉积符号判别法1、坐标比较法将点的某个方向分量与边界进行比较例如,判断某点是否在下边界内侧,用条件判别式: if(p[i][1]>=ymin) 即可2、向量叉积法为简单计,测试点表示为 P 点假设窗口边界方向为顺时针,如图中所示,对于其中任一边界向量,从向量起点 A 向终点 B 看过去:如果被测试点 P 在该边界线右边(即内侧),AB×AP 的方向与 X-Y 平面垂直并指向屏幕里面,即右手坐标系中 Z 轴的负方向反过来,如果 P 在该边界线的左边(即外侧),这时 AB×AP 的方向与 X-Y 平面垂直并指向屏幕外面,即右手坐标系中 Z 轴的正方向设:点 P(x,y)、点 A(xA,yA)、点 B(xB,yB),向量AB={(xB-xA),(yB-yA)},向量 AP={(x-xA),(y-yA)},那么 AB×AP 的方向可由下式的符号来确定:V=(x[B]-x[A])*(y-y[A])- (x-x[A])*(y[B]-y[A])) 因此,当 V≤0 时,P 在边界线内侧;而 V>0 时,P 在边界线外侧。
3.3.3 Sutherland 多边形裁剪算法特点Sutherland 多边形裁剪算法具有一般性,被裁剪多边形可以是任意凸多边形或凹多边形,裁剪窗口不局限于矩形,可以是任意凸多边形上面的算法是多边形相对窗口的一条边界进行裁剪的实现,对于窗口的每一条边界依 次调用该算法程序,并将前一次裁剪的结果多边形作为下一次裁剪时的被裁剪多边形,即 可得到完整的多边形裁剪程序84运行情况运行情况4.14.1基本图形绘制模块基本图形绘制模块程序运行主界面如图 5-1-1 所示图 5-1-1 程序运行主界面直线绘制如图 5-1-2 所示图 5-1-2 直线绘制圆形绘制如图 5-1-3 所示9图 5-1-3 圆形绘制矩形绘制如图 5-1-4 所示图 5-1-4 矩形绘制三角形绘制如图 5-1-5 所示图 5-1-5 三角形绘制10椭圆绘制如图 5-1-6 所示图 5-1-6 椭圆绘制4.24.2基本图形填充模块基本图形填充模块矩形填充如图 5-2-1 所示图 5-2-1 矩形旋转变换4.34.3直线的裁剪模块直线的裁剪模块直线裁剪如图 5-3-1 所示11图 5-3-1 待裁剪直线绘制5安装说明安装说明6.1.1 文件列表说明压缩包里文件列表及对应说明如下:Includegraphics.h 程序需要引用的头文件Lib(VC6)graphics6.lib VC6 MBCS 版本库文件graphics6u.lib VC6 Unicode 版本库文件Lib(VC2008)graphics7.lib VC6 以上版本 MBCS 版本库文件graphics7u.lib VC6 以上版本 Unicode 版本库文件 VcGraphHelp.chm 帮助文件6.1.2 安装说明将 Include 和对应的 Lib 文件夹下的文件分别拷贝到 VC 对应的 Include 和 Lib 文 件夹内,仅此而已。
例如,VC6 需要拷贝 graphics.h、graphics6.lib、graphics6u.lib 三个文 件12或者,将几个文件单独放到一个文件夹内,然后修改 VC 中的 Lib 和 Include 路径 也可以总之,就是要让 VC 能找到这几个文件VC2002/2003/2005 请复制 VC2008 的 库文件6总结总结本学期计算机图形学课程期末大作业主要的开发项目就是利用基本绘图算 法实现基本图形的绘制、填充、变换,以及直线的裁剪在完成此次大作业的 过程中遇到了许多困难,因为MFC掌握的不是很好,所以我选用了用纯C语言 实现图形。
