当前位置:文档之家› 计算机图形学报告

计算机图形学报告

计算机图形学大作业报告
课程名称:计算机图形学
姓名:
学号:
组员:
任课教师:
成绩:
1引言
1.1 编写目的
本学期计算机图形学课程期末大作业主要的开发项目就是基于MFC的基本图形的绘制、填充、变换,以及直线的裁剪。

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

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

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

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

1.2任务分工
xx:实现直线,圆,扫描线填充的算法。

xx:椭圆,裁剪。

xx:四连通种子填充,变换算法。

2 程序框架
2.1 程序模块
本系统是一个基于MFC开发的实现能够进行人机交互的基本图形的绘制、填充、变换,以及直线的裁剪的系统。

本系统中的功能模块主要分为以下几种:
基本图形绘制模块:实现直线、矩形、圆、椭圆的绘制及填充功能。

基本图形变换模块:实现直线、正三角形、矩形的平移、比例、旋转变换功能。

基本图形裁剪模块:实现直线的裁剪功能。

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

图2-1 程序框架图
2.2程序功能接口
接口名称:void CMyView::seed (int x,int y, int oldcolor,int newcolor) 功能说明:实现四连通种子填充。

参数说明:x,y:种子坐标;
oldcolor:背景颜色;
newcolor:线的颜色。

接口名称:void CMyView::OnPy()
功能说明:实现平移。

接口名称:void CMyView::OnXz()
功能说明:实现旋转。

接口名称:void CMyView::OnSf()
功能说明:实现缩放。

3主要算法描述
四连通的种子填充算法:
种子填充算法的基本思想是给定区域G一种子点(x,y),首先判断该点是否是区域内的一点,如果是,则将该点周围的四个点作为新的种子点进行同样的处理,通过这种扩散完成对整个区域的填充。

算法实现:可以利用递归的思想实现算法;如下:
void CMyView::seed (int x,int y, int oldcolor,int newcolor)//四连通种子填充算
{
CDC* pDC=GetDC();
int color,c1,c2,c3,c4;
color=pDC->GetPixel(x,y);
if (color==oldcolor)
{
pDC->SetPixel(x,y,newcolor);
c1=pDC->GetPixel(x, y+1);
c2=pDC->GetPixel(x, y-1);
c3=pDC->GetPixel(x+1, y);
c4=pDC->GetPixel(x-1, y);
if(c1!=newcolor)
seed (x, y+1,oldcolor, newcolor);
if(c2!=newcolor)
s eed (x, y-1,oldcolor, newcolor)
if(c3!=newcolor)
seed (x+1, y,oldcolor, newcolor);
if(c4!=newcolor)
seed (x-1, y,oldcolor, newcolor);
}
ReleaseDC (pDC);
}
我们采用一个矩阵类(Matrix)来保存矩阵和实现矩阵的操作,类如下:class Matrix //二维变换矩阵类
{
public:
Matrix (int , int);
Matrix (int, int, bool);
Matrix (float, float);
Matrix (float);
int getx () { return int( matrix[0][0] ); } //得到x坐标
int gety () { return int( matrix[1][0] ); } //得到y坐标
virtual ~Matrix();
Matrix operator * ( Matrix& ); //重载"*"操作符
private:
int m,n; //维数
double matrix[3][3];
};
其中Matrix(int ,int )用来构造二维矩阵坐标;Matrix(int ,int ,bool )用来构造二维平移矩阵;Matrix(float,float)构造二维放缩矩阵;Matrix(float)构造二维旋转矩阵;Matrix operator *(Matrix&)用于矩阵之间的运算;
平移算法:
思想:先用Matrix(int x,int y)来保存关键点的坐标矩阵,用Matrix(int,int,bool)来保存平移矩阵,然后通过两个矩阵相乘进行平移变换,代码如下:
void CMyView::OnPy()
{
// TODO: Add your command handler code here
flag=11;
OnClear();
Matrix a(200,180),b(5,5,true);
int i,r1=100,r2=70,white=RGB(255,255,255);
midellispse(a.getx(),a.gety(),r1,r2,COLOR);
for(i=0;i<50;i++){
::Sleep(100-i*2);
midellispse(a.getx(),a.gety(),r1,r2,white);
a=b*a;
midellispse(a.getx(),a.gety(),r1,r2,COLOR);
}
}
}
放缩算法:
算法思想:先用Matrix(int x,int y)来保存关键点的坐标矩阵,用Matrix (float,float)来保存放缩矩阵,然后通过两个矩阵相乘进行放缩变换;
旋转算法:
算法思想:算法思想:先用Matrix(int x,int y)来保存关键点的坐标矩阵,用Matrix(float)来保存旋转矩阵,然后通过两个矩阵相乘进行旋转变换;
3}创新技术
3.1双缓冲技术
在图像绘制的过程中,过于频繁地刷新,屏幕势必会出现闪烁的现象,CPU时问占用率相当高,绘图的效率极低,甚至会导致程序崩溃。

双缓冲技术指的就是在绘图时除了在屏幕上有图形进行显示外,在内存中也有图形在绘制。

把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。

这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为并不是在屏幕上直接操作。

当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小,这样看起来就不会闪了。

4运行情况
4.1基本图形绘制模块
四连通种子填充绘制如下图所示:
平移绘制如下图所示:
放缩绘制如下图所示:
旋转绘制如下图所示:
5总结
本学期计算机图形学课程期末大作业主要的开发项目就是基于MFC的基本图形的绘制、填充、变换,以及直线的裁剪。

在大作业的完成过程中,我们遇到了很多困难。

例如怎样更好地实现人机交互,怎样在绘图的过程中避免闪烁,经过同组同学的讨论和合作,在大作业中我们引入了双缓冲技术来有效地解决了问题。

同时,对计算机图形学的算法思想有了更深刻的体会。

由于时间有限,在大作业中仍存在一些不足。

参考文献:
[1] 张彩明,杨兴强,李学庆等. 计算机图形学[M].北京:科学出版社,2008.71-74.。

相关主题