Dos界面计算机图形学画图Word格式文档下载.docx
《Dos界面计算机图形学画图Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Dos界面计算机图形学画图Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
参数说明:
xs,ys:
起点坐标;
xe,ye:
终点坐标;
value:
画线颜色。
voiddrawCircle(intx0,inty0,intr,intvalue);
实现正负法画圆。
x0,y0:
圆心坐标;
r:
半径;
画圆颜色
voiddrawRectangle(intx0,inty0,intx1,inty1,intvalue);
实现画矩形。
矩形其中一个点的坐标;
x1,y1:
矩形对角点的坐标;
voiddrawTriangle(intx0,inty0,intx1,inty1,intx2,inty2,intvalue);
实现画三角形。
三角形第一个点的坐标;
三角形第二个点的坐标;
x2,y2:
三角形第三个点的坐标;
value:
voidmidellipse(intx,inty,intcolor);
实现画椭圆。
x,y:
椭圆中点坐标;
color:
voiddrawshape();
画填充图形。
无。
voidedgemark_fill();
图形填充。
initialize();
初始化界面。
voidencode(intx,inty,int*code)
给被裁剪图形编码。
intx:
图形位置的横坐标;
inty:
图形位置的纵坐标;
int*code:
记录点的位置。
voiddraw_ett();
实现图形裁剪
无
voidvoidchosenum();
提示选择功能。
voidCirclePoints(intx0,inty0,intx,inty,intvalue);
存储下一个圆上的点。
第一个点的坐标;
x,y:
圆点坐标;
value:
3主要算法描述
3.1边界标识法填充
扫描线具有连贯性,这种连贯性只有在扫描线与多边形相交处才会发生变化,而每次的变化结果:
无非是在前景色和背景色之间相互“切换”。
边标志填充算法正是基于这一发现,先在屏幕上生成多边形轮廓线,然后逐条扫描处理。
处理中:
逐点读取象素值,若为边界色,则对该象素值进行颜色切换。
1、用边界色画出多边形轮廓线,也就是将多边形边界所经过的象素打上边标志。
2、为了缩小范围,加快填充速度,须找出多边形的最小包围盒:
xmin、ymin、xmax、ymax。
如下图所示。
图3.1.1边标志填充算法
3、逐条扫描线进行处理,对每条扫描线依从左往右的顺序,逐个访问该扫描线上的象素。
每遇到边界象素,标志取反。
然后,按照标志是否为真,决定象素是否为填充色。
3.2正负法画圆
现以下图的AB弧为例,来说明正负画圆法(顺时针生成圆)。
图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+1。
2、当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为止。
同前面介绍的一样,利用圆的八分对称性,循环一次,画八个点。
3.3Sutherland裁剪算法
3.3.1Sutherland多边形裁剪算法思想
该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。
多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。
当多边形一个顶点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.3Sutherland多边形裁剪算法特点
Sutherland多边形裁剪算法具有一般性,被裁剪多边形可以是任意凸多边形或凹多边形,裁剪窗口不局限于矩形,可以是任意凸多边形。
上面的算法是多边形相对窗口的一条边界进行裁剪的实现,对于窗口的每一条边界依次调用该算法程序,并将前一次裁剪的结果多边形作为下一次裁剪时的被裁剪多边形,即可得到完整的多边形裁剪程序。
4运行情况
4.1基本图形绘制模块
程序运行主界面如图5-1-1所示。
图5-1-1程序运行主界面
直线绘制如图5-1-2所示。
图5-1-2直线绘制
圆形绘制如图5-1-3所示。
图5-1-3圆形绘制
矩形绘制如图5-1-4所示
图5-1-4矩形绘制
三角形绘制如图5-1-5所示。
图5-1-5三角形绘制
椭圆绘制如图5-1-6所示。
图5-1-6椭圆绘制
4.2基本图形填充模块
矩形填充如图5-2-1所示。
图5-2-1矩形旋转变换
4.3直线的裁剪模块
直线裁剪如图5-3-1所示。
图5-3-1待裁剪直线绘制
5安装说明
6.1.1文件列表说明
压缩包里文件列表及对应说明如下:
Include<
文件夹>
graphics.h 程序需要引用的头文件
Lib(VC6)<
graphics6.lib VC6MBCS版本库文件
graphics6u.lib VC6Unicode版本库文件
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三个文件。
或者,将几个文件单独放到一个文件夹内,然后修改VC中的Lib和Include路径也可以。
总之,就是要让VC能找到这几个文件。
VC2002/2003/2005请复制VC2008的库文件。
6总结
本学期计算机图形学课程期末大作业主要的开发项目就是利用基本绘图算法实现基本图形的绘制、填充、变换,以及直线的裁剪。
在完成此次大作业的过程中遇到了许多困难,因为MFC掌握的不是很好,所以我选用了用纯C语言实现图形的绘制、填充和裁剪,因为考虑到turboC使用起来不太方便,于是考虑到将TC下能够运行的程序移植到VC6.0上,这样操作起来就方便多了。
经过在网上多番查找资料,才找到了一种方法实现上述功能,将压缩包中的相应文件拷到VC的相应的安装目录下面。
因为在VCDOS界面下画图存在一定的局限,所以我只是实现了基本图形的简单绘制,图形的填充和图形裁剪算法。
在此次实验过程中我也遇到了很多问题比如说处理TC程序在VC中的兼容性问题,填充算法的堆栈溢出程序崩溃问题。
经过查阅大量资料终于解决了上述问题。
参考文献:
[1]张彩明,杨兴强,李学庆等.计算机图形学[M].北京:
科学出版社,2008.71-74.
[2]彭晏飞,刘建辉.橡皮筋技术在交互式绘图系统中应用[J].辽宁工程技术大学学报,2004,23(z1):
34-35.
[3]张磊.基于VC++的高效绘图——双缓冲技术[J].信息科学,2009(20):
61-61.