文档库 最新最全的文档下载
当前位置:文档库 › 计算机图形学课程设计透视投影图三视图

计算机图形学课程设计透视投影图三视图

计算机图形学课程设计透视投影图三视图
计算机图形学课程设计透视投影图三视图

计算机图形学程序课程设计

题目:分别在四个视区内显示空间四面体的三视图、透视投影图。

学院:信息科学与技术学院

专业:计算机科学与技术

姓名:oc

学号:oc

电话:oc

邮箱:oc

目录

一、设计概述

(1)设计题目。。。。。。。。。。。。。。。。。。。。。。。。2

(2)设计要求。。。。。。。。。。。。。。。。。。。。。。。。2

(3)设计原理。。。。。。。。。。。。。。。。。。。。。。。。2

(4)算法设计。。。。。。。。。。。。。。。。。。。。。。。。5

(5)程序运行结果。。。。。。。。。。。。。。。。。。。。。。9

二、核心算法流程图。。。。。。。。。。。。。。。。。。。。10

三、程序源代码。。。。。。。。。。。。。。。。。。。。。。12

四、程序运行结果分析。。。。。。。。。。。。。。。。。。。24

五、设计总结分析。。。。。。。。。。。。。。。。。。。。。25

六、参考文献。。。。。。。。。。。。。。。。。。。。。。。26

一.设计概述

?设计题目

计算机图形学基础(第二版)陆枫何云峰编著电子工业出版社:利用OpenGL中的多视区,分别在四个视区内显示图7-41所示空间四面体的主视图、俯视图、侧视图、透视投影图。

?设计要求

设计内容:

1. 掌握主视图、俯视图、侧视图和透视投影变换矩阵;

2. 掌握透视投影图、三视图生成原理;

功能要求:

分别在四个视区内显示P228-图7-41所示空间四面体的主视图、俯视图、侧视图、透视投影图。

?设计原理

正投影

正投影根据投影面与坐标轴的夹角可分为三视图和正轴测图。当投影面与某一坐标轴垂直时,得到的投影为三视图,这时投影方向与这个坐标轴的方向一致,否则,得到的投影为正轴测图。

1.主视图(V面投影)

将三维物体向XOZ平面作垂直投影,得到主视图。由投影变换前后三维物体上点到主视图上的点的关系,其变换矩阵为:

Tv=Txoz= [1 0 0 0]

[0 0 0 0]

[0 0 1 0]

[0 0 0 1]

Tv为主视图的投影变换矩阵。简称主视图投影变换矩阵。

2.侧视图(W面投影)

将三维物体向YOZ平面作垂直投影,得到侧视图。为使侧视图与主视图在一个平面内,就要使W面绕Z轴正向旋转90°。同时为了保证侧视图与主视图有一段距离,还要使W面再沿X方向平移一段距离x0,这样即得到侧视图。变换矩阵为:

Tv=Tyoz= [ 0 0 0 0 ]

[-1 0 0 0 ]

[ 0 0 1 0 ]

[-x0 0 0 1]

Tv为主视图的投影变换矩阵。简称主视图投影变换矩阵。

3.俯视图(H面投影)

将三维物体向XOY平面作垂直投影,得到俯视图。为使俯视图与主视图在一个平面内,就要使H面绕X轴负向旋转90°。同时为了保证侧视图与主视图有一段距离,还要使H面再沿Z方向平移一段距离-z0,

这样即得到侧视图。变换矩阵为:

Tv=Txoy= [ 1 0 0 0]

[0 0 -1 0]

[0 0 0 0 ]

[ 0 0–z0 1]

Tv为主视图的投影变换矩阵。简称主视图投影变换矩阵。

三视图常作为主要的工程施工图纸,因为在三视图上可以测量距离和角度。但一种三视图只有物体在一面的投影,所以单独从某一个方面的三视图很难想象出物体的三维形状,只有将主视图、侧视图和俯视图放在一起,才有可能综合处物体的空间形状。总的来说三视图中主视图、俯视图和侧视图都是通过变换矩阵得来的。

透视投影-一点透视

一点透视只有一个主灭点。灭点可以看做是无限远处的一个点在投影面上的点。一点透视的一般步骤:

?将三维物体平移到适当位置l,m,n.

?令视点在z轴,进行透视变换。

?最后,向xoy面做正投影变换,将结果变换到xoy面上。如此一点透视变换矩阵为:

Tv=Txoy= [ 1 0 0 0 ]

[ 0 1 0 0 ]

[ 0 0 0 1/d ]

[ l m 0 1+n/d]

?算法设计

核心算法

1.构造类表示三维坐标系下的点

struct DefPoint

{

double x, y, z, tag;

}

2.为顶点建立顶点表:

Point[MaxNum],TPoint[MaxNum],XOZPoint[MaxNum],XOYPoint[MaxNum ],YOZPoint[MaxNum],YOYPoint[MaxNum]

3.定义各个视图的变换矩阵以及变换函数

变换矩阵:

double Matrix[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 500, 300, 300, 1 } };个视图的显示算法。

void Display()

{

glClear(GL_COLOR_BUFFER_BIT);

OnCoordinate();

glColor3f, , ;

glBegin(GL_LINES);

glVertex2d(winWidth / 2, 0);

glVertex2d(winWidth / 2, winHeight);

glVertex2d(0, winHeight / 2);

glVertex2d(winWidth, winHeight / 2);

glEnd();

glColor3f, , ;

OnDraw(XOZPoint);

glColor3f, , ;

OnDraw(XOYPoint);

glColor3f, , ;

OnDraw(YOZPoint);

glColor3f, , ;

OnDraw_O(YOYPoint);

glutSwapBuffers();

}

5.三视图的划线算法

ize();

for (int j = 0; j

{

glVertex2d(TempPoint[Face[i][j]].x,

TempPoint[Face[i][j]].z);

glVertex2d(TempPoint[Face[i][(j + 1) % size]].x,

TempPoint[Face[i][(j + 1) % size]].z);

}

}

glEnd();

}

6.一点透视的划线算法

, TempPoint[0].y);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(TempPoint[0].x, TempPoint[0].y);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(TempPoint[0].x, TempPoint[0].y);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glEnd();

glColor3f, , ;

glBegin(GL_LINES);

glVertex2d(TempPoint[0].x,TempPoint[0].y); glVertex2d(0,

0);

glVertex2d(TempPoint[1].x,TempPoint[1].y); glVertex2d(0,

0);

glVertex2d(TempPoint[2].x,TempPoint[2].y); glVertex2d(0,

0);

glVertex2d(TempPoint[3].x,TempPoint[3].y); glVertex2d(0,

0);

glEnd();

}

(5)程序运行结果

二.核心算法流程图

(1)矩阵变换函数流程图

(2)三视图绘制算法流程图

三.程序源代码

#include""

#include<>

#include

#include

using namespace std;

const int MaxNum = 200;vectorFace[10]; = 400, Point[0].y = 0, Point[0].z = 0, Point[0].tag = 1;

Point[1].x = 400, Point[1].y = 200, Point[1].z = 0, Point[1].tag = 1;

Point[2].x = 0, Point[2].y = 200, Point[2].z = 0,

Point[2].tag = 1;

Point[3].x = 200, Point[3].y = 200, Point[3].z = 200, Point[3].tag = 1;

FaceNum = 4;

Face[0].push_back(0); Face[0].push_back(1);

Face[0].push_back(2);

Face[1].push_back(0); Face[1].push_back(1);

Face[1].push_back(3);

Face[2].push_back(0); Face[2].push_back(2);

Face[2].push_back(3);

Face[3].push_back(1); Face[3].push_back(2);

Face[3].push_back(3);

}

, ty = OldPoint[i].y,

tz = OldPoint[i].z, ttag = OldPoint[i].tag;

NewPoint[i].x = tx*Tran[0][0] + ty*Tran[1][0] +

tz*Tran[2][0] + ttag*Tran[3][0];

NewPoint[i].y = tx*Tran[0][1] + ty*Tran[1][1] +

tz*Tran[2][1] + ttag*Tran[3][1];

NewPoint[i].z = tx*Tran[0][2] + ty*Tran[1][2] +

tz*Tran[2][2] + ttag*Tran[3][2];

NewPoint[i].tag = tx*Tran[0][3] + ty*Tran[1][3] +

tz*Tran[2][3] + ttag*Tran[3][3];

if (NewPoint[i].tag != 0 && NewPoint[i].tag != 1)

{

NewPoint[i].x /= NewPoint[i].tag,

NewPoint[i].y /= NewPoint[i].tag,

NewPoint[i].z /= NewPoint[i].tag,

NewPoint[i].tag = 1;

}

}

}

ize();

for (int j = 0; j

{

glVertex2d(TempPoint[Face[i][j]].x,

TempPoint[Face[i][j]].z);

glVertex2d(TempPoint[Face[i][(j + 1) % size]].x,

TempPoint[Face[i][(j + 1) % size]].z);

}

}

glEnd();

}

, TempPoint[0].y);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(TempPoint[0].x, TempPoint[0].y);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(TempPoint[0].x, TempPoint[0].y);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glEnd();

glColor3f, , ;

glBegin(GL_LINES);

glVertex2d(TempPoint[0].x, TempPoint[0].y);

glVertex2d(0, 0);

glVertex2d(TempPoint[1].x, TempPoint[1].y);

glVertex2d(0, 0);

glVertex2d(TempPoint[2].x, TempPoint[2].y);

glVertex2d(0, 0);

glVertex2d(TempPoint[3].x, TempPoint[3].y);

glVertex2d(0, 0);

glEnd();

}

lear();

glClearColor,, , ;

ThPmidInit();

GetThPmidView();

}

int main(int argc, char* argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

glutInitWindowSize(1000, 600);

glutInitWindowPosition(150, 100);

glutCreateWindow("三维图形透视投影图&三视图演示程序");

glutDisplayFunc(Display);

glutReshapeFunc(ReShape);

Initial();

glutMainLoop();

return 0;

}

四.程序运行结果分析

在程序中预先输入要实现的三维物体的顶点和面的信息,然后经过矩阵变换函数,得到变换后的函数。然后由划线函数绘制出图形。

系统不足及改进方案

在完成计算机图形学课程设计后,我发现还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能很好完成。其实我的这个设计只是一个很简单的东西,仅仅实现了最简单的透视投影图,三视图的算法罢了,受限于知识缺乏的影响,不能实现较理想的设计。我认为较理想的设计是,最重要的一点是增加设计的灵动性,最大便利于用户和观众,让他们觉得这个设计是不错的东西。可以再程序中实现让用户输入三维物体的顶点和面的信息,并且建立一个三维坐标系将图形放在原点处,使用户一目了然,同时也将三视图置于二维坐标系中,并标出哪个是哪个图形,即各个图形代表的意思。

我认为解决以上问题只有通过在以后的学习,对图形学和OpenGL 有更深的了解才有可能解决该问题。同时要彻底学好C++这门语言,没有精通的语言,就无法实现更完美的功能和设计。

这次实践增强了我的动手能力,提高和巩固了图形学方面的知识,特别是软件方面。让我认识到把理论应用到实践中去是多么重要。这个过程中,我花费了大量的时间和精力,更重要的是,我在学会实践的基础上,同时还懂得合作精神的重要性,学会了互相学习。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在各位同学和老师地帮助下,终于游逆而解。同时,在老师那里我学到了很多实用的知识。我表示再次衷心的感谢!

五.设计总结分析

紧张而愉快的计算机图形学课程设计终于顺利完成了,历时一周时间,其中包含着快乐,也有辛酸。我选的设计题目是关于“透视投影和三视图的设计”,开始的时候觉得这个题目是比较简单的,不就是几个矩阵作运算罢了。其实不然,做了之后,发现设计思路虽然简单,但我认为它真正困难的地方是程序设计,是要怎样设计实现矩阵算法的程序代码,怎样让自己的程序代码看起来简练实现的功能又强。不过在我在认真学习和在网上查找资料后最终完成了设计,最终实现了透视投影和三视图的算法。

通过一周的努力,我对图形学有了更深的认识,突然发现图形学是一门很有意思的课程,世界可以被你玩于股掌之中,想让它实现什么就可以调用函数实现功能,想要什么色彩都可以的图形学在现在的社会中是有很多用处的,任何物体模型都离不开使用到它,所以我会在将来的学习生活中多注意这方面的相关知识的,掌握一样技能不是多余的,而是为自己将来工作又增加了一份资本。

六.参考文献

(1)计算机图形学基础(第二版)陆枫何云峰编著电子工业出版社.(2)CSDN博客:作者:晓风残月。计算机图形学三维变换、三维观察与消隐算法的实现。博客地址:

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学试卷与答案

一、填空题(每空0.5分,共 1 0 分) 1、 计算机图形学中的图形是指由点、线、面、体等 和明暗、灰度(亮度)、色 彩等 构成的,从现实世界中抽象出来的带有灰度、色彩及形状的图或形。 2、 一个计算机图形系统至少应具有 、 、输入、输出、 等 基本功能。 3、 常用的字符描述方法有:点阵式、 和 。 4、 字符串剪裁的策略包括 、 和笔划/像素精确 度 。 5、 所谓齐次坐标就是用 维向量表示一个n 维向量。 6、 投影变换的要素有:投影对象、 、 、投影线和投影。 7、 输入设备在逻辑上分成定位设备、描画设备、定值设备、 、拾取设备 和 。 8、 人机交互是指用户与计算机系统之间的通信,它是人与计算机之间各种符号和动作 的 。 9、 按照光的方向不同,光源分类为: , , 。 10、从视觉的角度看,颜色包含3个要素:即 、 和亮度。 二、单项选择题(每题 2分,共 30 分。请将正确答案的序号填在题后的括号内) 1、在CRT 显示器系统中,( )是控制电子束在屏幕上的运动轨迹。 A. 阴极 B. 加速系统 C. 聚焦系统 D. 偏转系统 2、分辨率为1024×1024的显示器需要多少字节位平面数为16的帧缓存?( ) A. 512KB B. 1MB C. 2MB D. 3MB 3、计算机图形显示器一般使用什么颜色模型?( ) A. RGB B. CMY C. HSV D. HLS 4、下面哪个不属于图形输入设备?( ) A. 键盘 B. 绘图仪 C. 光笔 D. 数据手套 5、多边形填充算法中,错误的描述是( )。

A. 扫描线算法对每个象素只访问一次,主要缺点是对各种表的维持和排序的耗费较大 B. 边填充算法基本思想是对于每一条扫描线与多边形的交点,将其右方象素取补 C. 边填充算法较适合于帧缓冲存储器的图形系统 D. 边标志算法也不能解决象素被重复访问的缺点 6、 在扫描线填色算法中,扫描线与顶点相交时,对于交点的取舍问题,下述说法正确的是( )。 A. 当共享顶点的两条边分别落在扫描线的两边时,交点只算2个 B. 当共享交点的两条边在扫描线的同一边时,若该点是局部最高点取1个 C. 当共享交点的两条边在扫描线的同一边时,若该点是局部最低点取2个 D. 当共享顶点的两条边分别落在扫描线的两边时,交点只算0个 7、在多边形的逐边裁剪法中,对于某条多边形的边(当前处理的顶点为P ,先前已处理的多边形顶点为S)与某条裁剪线(窗口的某一边)的比较结果共有以下四种情况,分别需输出一些顶点。请问哪种情况下输出的顶点是错误的? ( ) A. S 和P 均在可见的一侧,则输出点P B. S 和P 均在不可见的一侧,则输出0个顶点 C. S 在可见一侧,P 在不可见一侧,则输出线段SP 与裁剪线的交点和点S D. S 在不可见的一侧,P 在可见的一侧,则输出线段SP 与裁剪线的交点和P 8、使用下列二维图形变换矩阵:,将产生变换的结果为( )。 A. 图形放大2倍 B. 图形放大2倍,同时沿X 、Y 坐标轴方向各移动1个绘图单位 C. 沿X 坐标轴方向各移动2个绘图单位 D. 沿X 坐标轴方向放大2倍,同时沿X 、Y 坐标轴方向各平移1个绘图单位 9、透视投影中主灭点最多可以有几个? ( ) A. 0 B. 1 C. 2 D. 3 10、图形软件系统提供给用户三种基本的输入控制方式,不包含的选项是( ) A. 请求方式 B. 采样方式 C. 事件方式 D. 随机方式 11、下面哪个不是拾取技术中拾取一个基本对象的方法?( ) A. 指定名称法 B. 拖曳法 C. 特征点法 D. 外接矩形法 12、在明暗的光滑处理方法中,下列论述哪个是错误的?( ) A. Gouraud 明暗模型计算中,多边形与扫描平面相交区段上每一采样点的光亮度值是由扫描平面与多边形边界交点的光亮度插值得到的 B. Phong 通过对多边形顶点的法矢量进行插值,获得其内部各点的法矢量 C. Gouraud 计算工作量比Phong 方法计算工作量大 D. Gouraud 明暗模型处理的缺点是它使高光部位变得模糊 13、光线跟踪算法中包含了哪些光照效果?( ) A. 仅有光反射 B. 仅有光透射 C. 有光反射和光透射 D. 都没有 ????? ?????=111010002T

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学习题

计算机图形学部分习题答案 王飞 1.流水线的主要特点是每个基元可以单独处理,这样的结构不尽使性能更快,而且降低了内存需求,主要缺点是我们不能操控大多数全局效果,如阴影,反射 2.视帧缓存的深度而定,以帧缓存为深度为1为例,速度为 1024*1280*1*72b=11.25MB/s,即读取一个像素用时倒数分之1每秒。隔行扫描,72变30. 3.每帧480*640像素的视频显示仅含有300K像素(普屏动画),而2000*3000像素的电影帧有6M像素,约多了18倍的显示时间,因此需要18倍的时间进行渲染。 4.略 5.分别在x方向和y方向上对这个问题进行解答。变换是线性的,也就是,Xs=ax+b,Ys=cy+d,映射的时候必须保证比例保持不变,即有 =得到 Xs=u+w* 同理可得 Ys=v+h* 6.可以使用扫描线的方式,每一个扫描线对应于帧缓存中的一行像素,通过交点的方式判断点是否在多边形内部。按照一定的方向观察扫描线与多边形的交点,第一个交点是扫描线上接下来一系

列在多边形内部的点的起点,第二个交点是离开多边形的起点,第三个交点又是进入的起点。依次进行,根据点在那两个交点之间即可判断是否在多边形内。按照一定方向移动扫描线,即可完成对所有点的判断。 7.可以得知帧缓存的深度为6 8.使用扫描线判断。每一条扫面线与凸多边形至多有两个交点,从一个方向朝另一个方向移动扫描线,扫描完毕,只要中途未出现两个人以上交点,则为凸多边形。 9.定义笔画字体时,最主要的问题是如何描述具有弯曲笔画和孔的字符,比如字母“a”和字母“q” 10.会出现很多潜在的问题,比如,应用程序会把对象坐标系中不同的点映射到屏幕坐标系的相同位置,第二,屏幕坐标系上的点转换回对象坐标系时,改点可能会落在用户窗口以外。 11.使用游戏杆的游戏大多操作比较简单,共有两个三位置转换开关,则可产生九中不同组合的编码控制信息,进而控制游戏的进行。 12.略 (1)旋转和均匀缩放 假设缩放矩阵为 旋转矩阵为(绕Z轴旋转)

计算机图形学实验指导书1

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

计算机图形学心得体会

计算机图形学心得体会 姓名: 学号: 201203284 班级: 计科11202 序号: 31 院系: 计算机科学学院

通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从您的课上我学到了不少知识,基本上对图形学有了一个大体的认识。上课的时候,您的PPT做的栩栩如生,创意新颖的FLASH就吸引了我的眼球,再加上您那详细生动的讲解,就让我对这门课产生了浓厚的兴趣,随着一节一节课的教学,您的讲课更加深深地吸引了我,并且随着对这门课越来越深入的了解更促使我产生了学好这门的欲望。您教会了我们怎们做基本知识,还教了我们不少的算法。听您的课可以说是听得津津有味。以下就是我对计算机图形学这门课的认识。 一、图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看图形主要分为两类一类是基于线条信息表示的如工程图、等高线地图、曲面的线框图等另一类是明暗图也就是通常所说的真实感图形。计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此必须建立图形所描述的场景的几何表示再用某种光照模型计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时真实感图形计算的结果是以数字图像的方式提供的计算机图形学也就和图像处理有着密切的关系。 二、计算机图形学的研究内容非常广泛如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。1990年的第11届亚洲运动会上首次采用了计算机三维动画技术来制作有关的电视节目片头。继而以3D Studio 为代表的三维动画微机软什和以Photostyler、Photoshop等为代表的微机二维平面设计软件的普及对我国计算机动画技术的应用起到了推波助谰的作用。计算机动画的应用领域十分宽广除了用来制作影视作品外在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、机械设计等许多方面都有重要应用如军事战术模拟。 三、科学计算可视化它将科学计算过程中及计算结果的数据转换为几何

最新计算机图形学期末考试试卷

最新计算机图形学期末考试试卷 一、判断题(本大题共 10 小题,每小题 1 分,共 10 分) 1. 计算机图形生成的基本单位是线段. ( F ) 2. 构成图形的要素除了点、线、面、体等几何要素外,还应该包括灰度、色彩、线型、 线宽等非几何要素. ( N ) 3. 在齐次坐标系中,若用矩阵来表示各种运算,则比例和旋转变换是矩阵F 乘法运算, 而平移变换是矩阵加法运算. ( F ) 4. Z-Buffer 消隐算法有利于硬件实现,并且不需要排序. ( N ) 5. 二次Bezier 曲线和二次B 样条曲线都通过控制多边形的首末端点. ( F ) 6. 一个向量的齐次坐标的表示形式是唯一的. ( F ) 7. 计算机图形技术是随着图形硬件设备的发展而发展起来的. ( N ) 8. Phong 算法的计算量要比Gouraud 算法小得多. ( F ) 9. 将某二维图形整体放大2倍,其变换矩阵可写为. ( F ) 10. 图形软件标准是为提高图形软件的易用性而提出的. ( F ) 二、填空题(本大题共 10 空,每空 1 分,共 10 分) 1. 在多边形填充过程中,常采用、 左闭右开 和 下闭上开 的原则 对边界像素进行处理. 2. 基本几何变换指 平移 、 比例 和 旋转 三种变换. 3. 屏幕上最小的发光单元叫作 像素 ,它的多少叫做 分辨率 . 4. ISO 批准的第一个图形软件标准是 GKS ,进入20世纪90年代后,存 在的事实上的图形软件标准主要是 OpenGL 和 Direct x . ?? ?? ? ?????200010001

5.图形的表示方法有两种:参数法和点阵法. 6.多边形的表示方法有顶点表示法和点阵表示法两种. 7.计算机三维模型的描述有线框模型、表面模型和实体 模型. 8.颜色包含3个要素:色调、饱和度和亮度 . 三、简答题(本大题共5 小题,每小题5 分,共25 分) 1.计算机图形学研究的主要内容是什么? 2.什么是齐次坐标?齐次空间点 P(X、Y、W) 对应的笛卡尔坐标是什么? 3.帧缓存的容量与什么有关?假定一个光栅扫描系统,分辨率800×600,要求可显示颜色256种,请问帧缓存的容量需要多少字节? 4.什么是走样?什么是反走样?常用的反走样技术有哪些? 5.简单光照模型的反射光由哪几部分组成,光照计算时有哪两种明暗处理技术?

《计算机图形学》复习试题

计算机图形学模拟试卷 计算机图形学课程试卷(卷) 注意:1、本课程为必修(表明必修或选修),学时为 51 ,学分为 3 2、本试卷共 3 页;考试时间 120 分钟;出卷时间:年 12 月 3、姓名、学号等必须写在指定地方;考试时间:年 1 月 11 日 4、本考卷适用专业年级:任课教师: (以上内容为教师填写) 专业年级班级 学号姓名 一、名词解释(15分) 1.国际标准化组织(ISO)对计算机图形学的定义

2.象素图 3.正投影 4.纹理 5.位图 二、写出下列述语的全称及中文含义。 1、GKS (Graphics Kernel System):图形核心系统 2、PHIGS(Programmer's Hierarchical Interactive Graphics System):程序员级分层结构交互图形系统 (Programmer's Hierarchical Interactive Graphics Stander):面向程序员的层次交互图形标准 3、CAD (Computer Assistant Design):计算机辅助设计 4、CAM (computer Aided Manufacturing):计算机辅助制造 5、CAGD (Computer Aided Geometric Design):计算机辅助几何设计 6、CIMS (Computer Integrated Manufacturing Systems):计算机集成制造系统 7、API (Application Programming Interface):应用程序编程接口 8、DPI (Dot Per Inch):指在每英寸长度内的点数。 9、CPU (Central Processing Unit):中央处理器 10、DPU (Distributed Processor Unit):数据保护单元 11、MBR (Minimum Bounding Rectangle) :最小外包矩形 12、CRT (Cathode Ray Tube):阴极射线管 13、LED (Light Emitting Diode):发光二极管

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

计算机图形学课程设计

《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法 专业计算机科学与技术 班级计科15升-1班 学号 1516353004 姓名 指导教师王玉琨 2016 年 06 月 07 日

目录 设计内容与要求 (03) 总体目标和要求 (03) 内容与要求 (03) 总体设计 (03) 2.1 球的消隐处理基本原理 (03) 2.2 具体设计实现 (04) 详细设计 (04) 3.1调试后正确的程序清单 (04) 功能实现 (08) 4.1程序运行结果 (09) 4.2 功能实现及分析 (09) 总结 (09) 参考文献 (10)

球体背面剔除消隐算法 第 1章设计内容与要求 1.1 总体目标和要求 课程设计的目的:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统, 并能从某些方面作出评价和改进意见。 通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到: 1) 巩固和实践计算机图形学课程中的理论和算法; 2) 学习表现计算机图形学算法的技巧; 3) 培养认真学习、积极探索的精神; 4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力; 5) 完成对实验结果分析、总结及撰写技术报告的能力。 总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。 开发环境:Viusal C++ 6.0 1.2 内容与要求 球体背面剔除消隐算法 内容:(1)掌握背面剔除消隐算法原理; (2)实现矢量点积与叉积运算; (3)透视投影变换 (4)曲面体经纬线划分方法 功能要求: (1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐; (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐; (3)使用键盘的上下左右控制键旋转消隐前后的球体; (4)单击左键增加视距,右击缩短视距; 第2章总体设计 2.1 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。 网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。 当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。 球面的参数方程为:

计算机图形学在影视中的应用

计算机图形学在影视中的应用 摘要: 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。计算机图形学是随着计算机及其外围设备而产生和发展起来的,作为计算机科学与技术学科的一个独立分支已经历了近40年的发展历程。一方面,作为一个学科,计算机图形学在图形基础算法、图形软件与图形硬件三方面取得了长足的进步,成为当代几乎所有科学和工程技术领域用来加强信息理解和传递的技术和工具。另一方面,计算机图形学的硬件和软件本身已发展成为一个巨大的产业。 关键词:opengl,计算机图形学,计算机动画 在当今时代下,计算机图形学(简称CG)动画已经成为时尚科技的代名词。CG是通过计算机软件所绘制的一切图形的总称。从二维到三维,从平面印刷\网页设计行业到三维动画,影视特效行业,CG随着技术的不断提高,应用的领域也在不断的壮大着。。现今更是形成了一个可观的经济产业。同时它在影视界已经的地位也是无人能撼。 CG动画概念 动画是通过连续播放一系列画面,给视觉造成连续变化的图画。它的基本原理是视觉原理。人类具有“视觉暂留”的特性,就是说人的眼睛看到一幅画或一个物体后,在1/24秒内不会消失。利用这一原理,在一幅画还没有消失前播放出下一幅画,就会给人造成一种流畅的视觉变化效果。动画的概念分类随着科技水平的提高不断变化着。现今动画可分为以手工绘制为主的传统动画和以计算机为主的电脑动画。CG动画,CG技术与传统动画的完美结合。CG动画指电脑制作动画,就是电脑原先就制作好了的动画,主机只需要播放就可以了。跟它相对应的是即时演算动画,是一段程序需要主机进行计算才能播放出的动画。相比较传统动画,CG动画节省了很多的纸张,无论是在人力方面还是在物力方面,都是一种质的进化。一般来说,CG动画的画面要比即时演算的强上不少,占用的空间也比即时演算的要少。 CG动画在影视上的发展 众所周知,CG最先起源于美国,作为拥有世界顶级计算机技术的国家,美国率先将CG技术引用到影视制作中,随着时间的变化,CG在影视制作中发挥着越来越重要的作用,它在影视方面带来的为美国带来的了客观的经济利益,深刻影响了美国的经济发展。 其实很多人都不知道什么是CG,它有什么用处。其实它就在我们身边。想必大家都看过电影吧,其实电影面的很多特效都是用CG动画制成的。比如说:在《变形精钢》中各种机器人的变身以及战斗时的激烈画面。在《侏罗纪公园》中CG几乎全部取代取代了原有的传统动画,出现每一个特技镜头中。现在3D电影在我们生活中已经是“家常便饭”了,几乎随处可见,这说明2D电影的时代已经过去,我们迎来了新的3D电影时代。很多人很疑惑为什么会有3D这么神奇的效果,感觉就像发生在眼前一样的。那么现在就来谈谈3D电影! 3D是一个虚拟的“真实世界”,因为二维世界所描述的画面真实度不高,缺乏立体感。3DCG动画技术能够去弥补这个缺陷带给人们一种立体感。随着技术的发展,3DCG动画技术的成熟应用,使得动画模拟真实世界成为现实。人们可以从三度空间的视角中去感受所创造的立体画面,把想象和现实融合在一起,其真实程度可完全以假乱真。二维动画艺术的主要表现形式与传统绘画有着姊妹般的血缘关系,其手法以绘画语言为主,虽然CG动画也有2D法,但它们都局限在二维空间,想表现立体视觉空间却难有作为。二维空间的概念就是在平面上,由最基木的点为基础再组成线,再由线勾成平面,这个平面就称之为二维空间。

计算机图形学 光照及纹理报告

《计算机图形学》综合训练项目报告

关键代码及界面展示1.源代码 //头文件 #ifndef GLWIDGET_H #define GLWIDGET_H #include #include class GLWidget : public QGLWidget { Q_OBJECT public: explicit GLWidget(QGLWidget *parent = 0); ~GLWidget(); protected: void initializeGL(); void paintGL(); void resizeGL(int width, int height); void keyPressEvent(QKeyEvent *e); void loadTextures(); bool fullscreen; GLuint texture[3]; private: float rotate_angle; float zoom; float rotate_speed; int filter; bool light; bool blend; }; #endif // GLWIDGET_H //主函数 #include "glwidget.h" #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); GLWidget w; w.show(); return a.exec(); }

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

计算机图形学实验报告 课程设计 大作业

安徽建筑工业学院 计算机图形学实验报告 院(系)名称: 专业: 班级: 姓名: 学号: 指导老师:

实验一实现任意直线的中点画线算法 【实验目的】 掌握直线的中点画线算法; 【实验环境】 VC++6.0 【实验内容】 利用任意的一个实验环境,编制源程序,实现直线的中点画线法。 【实验原理】 假定直线斜率k在0~1之间,当前象素点为(x p,y p),则下一个象素点有两种可选择点P1(x p+1,y p)或P2(x p+1,y p+1)。若P1与P2的中点(x p+1,y p+0.5)称为M,Q为理想直线与x=x p+1垂线的交点。当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。 图2.1.2 中点画线法每步迭代涉及的象素和中点示意图 下面讨论中点画线法的实现。过点(x0,y0)、(x1, y1)的直线段L的方程式为F(x, y)=ax+by+c=0,其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0,欲判断中点M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。为此,我们构造判别式: d=F(M)=F(x p+1, y p+0.5)=a(x p+1)+b(y p+0.5)+c

当d<0时,M在L(Q点)下方,取P2为下一个象素; 当d>0时,M在L(Q点)上方,取P1为下一个象素; 当d=0时,选P1或P2均可,约定取P1为下一个象素; 注意到d是x p, y p的线性函数,可采用增量计算,提高运算效率。 若当前象素处于d 0情况,则取正右方象素P1(x p+1, y p),要判下一个象素位置,应计 算d1=F(x p+2, y p+0.5)=a(x p+2)+b(y p+0.5)=d+a,增量为a。 若d<0时,则取右上方象素P2(x p+1, y p+1)。要判断再下一象素,则要计算d2= F(x p+2, y p+1.5)=a(x p+2)+b(y p+1.5)+c=d+a+b ,增量为a+b。画线从(x0, y0)开始,d的初值d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b,因F(x0, y0)=0,所以d0=a+0.5b。 由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。因此,我们可以用2d代替d来摆脱小数,写出仅包含整数运算的算法程序。 【实验程序】 void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1; b=x1-x0;d=2*a+b; d1=2*a;d2=2* (a+b); x=x0;y=y0; drawpixel(x, y, color); while (x

相关文档
相关文档 最新文档