Dos界面计算机图形学画图.docx

上传人:b****6 文档编号:5071254 上传时间:2022-12-13 格式:DOCX 页数:12 大小:106.20KB
下载 相关 举报
Dos界面计算机图形学画图.docx_第1页
第1页 / 共12页
Dos界面计算机图形学画图.docx_第2页
第2页 / 共12页
Dos界面计算机图形学画图.docx_第3页
第3页 / 共12页
Dos界面计算机图形学画图.docx_第4页
第4页 / 共12页
Dos界面计算机图形学画图.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Dos界面计算机图形学画图.docx

《Dos界面计算机图形学画图.docx》由会员分享,可在线阅读,更多相关《Dos界面计算机图形学画图.docx(12页珍藏版)》请在冰豆网上搜索。

Dos界面计算机图形学画图.docx

Dos界面计算机图形学画图

Dos界面计算机图形学画图

计算机图形学大作业报告

 

课程名称:

计算机图形学

姓名:

陶向东

学号:

100511726

组员:

任课教师:

贾瑜

成绩:

 

1引言

1.1编写目的

本学期计算机图形学课程期末大作业主要的开发项目就是基于DOS的基本图形的绘制、填充、变换,以及直线的裁剪。

实现语言VC++,编辑、调试环境VC++6.0。

此次大作业的完成是对计算机图形学基础知识的检验和测试,在撰写报告的过程中我能够更深刻地了解计算机图形学算法的思想,通过这份文档来记录我们在开发此软件的过程中遇到的问题以及改善的方法。

现在对整个开发过程加以认识、记录和总结,留下经验,汲取教训。

为以后的其他工作留下经验资料,为以后遇到相同的问题和从事类似项目奠定坚实的基础。

1.2任务分工

陶向东:

实现直线、正三角形、矩形、椭圆的绘制,图形的边界标识填充算法,实现直线的裁剪算法。

2程序框架

2.1程序模块

本系统是一个基于DOS开发的实现能够基本图形的绘制、填充、变换,以及直线的裁剪的系统。

本系统中的功能模块主要分为以下几种:

基本图形绘制模块:

实现直线、矩形、圆、椭圆的绘制功能。

基本图形填充模块:

实现矩形的填充功能。

基本图形裁剪模块:

实现直线的裁剪功能。

 

程序框架如图2-1所示。

图2-1程序框架图

 

2.2程序功能接口

接口名称:

voiddrawLine(intxs,intys,intxe,intye,intvalue);

功能说明:

实现正负法画直线。

参数说明:

xs,ys:

起点坐标;

xe,ye:

终点坐标;

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);

功能说明:

存储下一个圆上的点。

参数说明:

x0,y0:

第一个点的坐标;

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.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1