计算机图形学设计

计算机图形学设计
计算机图形学设计

《计算机图形学》课程设计报告题目名称:机器人手臂

专业计算机科学与技术

班级

学号

姓名

指导教师王玉昆

2014年 6月 12 日

机器人手臂

一、设计内容与要求

1.1 设计题目

机器人手臂

1.2 设计内容

内容:

(1)掌握动画基本原理;

(2)实现三维几何变换及其组合;

功能要求:

(1)利用glutWireCube创建机器手臂:上臂,前臂,带有手指的手

(2)编写三维旋转变换矩阵实现“上臂带动前臂转,前臂带动手转”的效果;(3)使用键盘的上下左右控制键各部分的旋转;

1.3 设计目标

通过课程设计,使学生具备通过具体的平台实现图形算法的设计、编程与调试的能力,完成对实验结果分析、总结及撰写技术报告的能力,达到:

巩固和实践计算机图形学课程中的理论和算法;

学习表现计算机图形学算法的技巧;

培养认真学习、积极探索的精神。

二、方案设计

2.1 总体方案设计

1.图形学基本原理

(1)几何变换相关原理

视点变换和模型变换在计算机图形学中统一称为几何变换。视点变换和模型变换只是考虑问题的出发点不同,最后变换的结果都是一样的。几何变换是指三维场景中的物体运动姿态的变化,包括物体的平移,旋转和缩放。在OpenGL中提供了3个命令函数来实现平移,旋转和缩放。它们是glTranslate(),glRotate(),glScale(),从而可以确定一个物体在场景中的位置,旋转角度和缩放比例。直接使用OpenGL中的矩阵操作函数可以实现几何变换,但是使用OpenGL中的变换函数,变换的速度要快得多。

(2)几何图形像素化相关原理

是指单元格中颜色值相近的像素结成块来清晰的定义一个选区。

(3)光照模型相关原理

当光线照射到物体表面上时,将出现3种情况:

光从物体表面反射,形成反射光。

光穿透物体,形成透射光。

光被物体吸收,转化称为物体的内能。

在上述3种情形的光线中,通常只有前两种情况的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。

OpenGL用一种近似的光照模型模拟现实世界的光照效果。在该模型中,仅当物体表面吸引和反射光线时,光源才会起作用。每一个物体表面都假定是由具有某种特性的材料构成的。一种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能象镜子一样在某个方向强烈地反射入射光。

2.2.系统界面与操作说明

(1) 系统界面与图形显示示例

(2) 操作说明(配合图示进行说明)

肩膀:'a'顺时针旋转,'A'逆时针旋转 手臂:'s'顺时针旋转,'S'逆时针旋转

手掌:'d'顺时针旋转,'D'逆时针旋转

大拇指:'g'向外翻转,'G'向内翻转

大拇指指尖:'t'向外翻转,'T'向内翻转食指:'h'向内,'H'向外

食指指尖:'y'向外翻转,'Y'向内翻转中指:'j'向内,'J'向外

中指指尖:'u'向外翻转,'U'向内翻转无名指:'k'向内,'K'向外

无名指指尖:'i'向外翻转,'I'向内翻转

小指:'l'向内,'L'向外

小指指尖:'o'向外翻转,'O'向内翻转

2.3 过程流程图

五步初始化窗口的模式

调用

调用显示模型

三、详细设计

3.1、源程序与注释

#include

#include "gl/glut.h"//添加公用库,不然无窗口也无法使用键盘

//一些函数要求OpenGL的类型作为参数,GLfloat,32-bit 浮点

GLfloat rotShoulder = 0.0; //肩 -45~90

GLfloat rotElbow = 0.0; //肘 0~160

GLfloat rotWrist = 0.0; //腕 -80~80

//以下取值范围为 0~90

GLfloat rotFinger10 = 0.0; //拇指和手掌相联的关节

GLfloat rotFinger11 = 0.0; // 手指上的关节

GLfloat rotFinger20 = 0.0; //食指

GLfloat rotFinger21 = 0.0;

GLfloat rotFinger30 = 0.0; //中指

GLfloat rotFinger31 = 0.0;

GLfloat rotFinger40 = 0.0; //无名指

GLfloat rotFinger41 = 0.0;

GLfloat rotFinger50 = 0.0; //小指

GLfloat rotFinger51 = 0.0;

void init()

{

static GLfloat light0_position[] = {1.0, 1.0, 1.0, 0.0};

static GLfloat light0_diffuse[] = {0.0, 1.0, 1.0, 1.0};

glClearColor(1.0, 1.0, 0.0, 0.0);//建立窗口被创建成为什么背景色黄色

glShadeModel(GL_SMOOTH);//一个多边形可以初始化为一个颜色(flat shading) 或者多个不同的颜色(smooth shading),此函数默认指定为GL_SMOOTH

glEnable(GL_DEPTH_TEST);//状态可以改变,和它相反的是glDisable()

glEnable(GL_LIGHTING);//OpenGL必须明确定义光照,不然关照模型,光源,材质都无法显示

glLightfv(GL_LIGHT0, GL_POSITION, light0_position);

glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);//可以定以至少8种光,这

里是白光。可以定义为聚光灯还是泛光灯

glEnable(GL_LIGHT0);//定义了你要的灯的特征,你要把它们用此函数转化,你也需要调用glEnable()准备运行灯光函数的计算参数

}

void reshape(GLsizei w, GLsizei h)//32位整形,相当于long

{

if(0==h)

h=1;

glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 500.0);

glMatrixMode(GL_MODELVIEW);

}

void display()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空色深缓冲和位深缓冲

glLoadIdentity();//当视角转换被指定,先要定义当前矩阵,如果不定义会和上

次的矩阵一起

gluLookAt(0.0, 0.0, 60.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//指定相机的放置,目标指向哪,什么方式(0,1,0)向上指示

glRotatef(30.0, 0.0, 1.0, 0.0);//关于y轴偏30°

glPushMatrix(); //肩

glTranslatef(6.0, 0.0, 0.0);//把对象正移6个单位/把视点负移6个单位

glRotatef(rotShoulder, 0.0, 0.0, 1.0);//沿z轴旋转rotShoulder角度

glScalef(12.0, 2.0, 4.0);//这个函数用来指定沿三个轴缩放多少,x轴12,y轴2, z轴4

glutSolidCube(1.0);

glScalef(1.0/12.0, 1.0/2.0, 1.0/4.0); //消除对之后坐标的影响

glPushMatrix(); //肘

glTranslatef(6.0, 0.0, 0.0);

glRotatef(rotElbow, 0.0, 0.0, 1.0);

glTranslatef(6.0, 0.0, 0.0); //分两次平移,第一次使得旋转轴在立方体尾部

glScalef(12.0, 2.0, 4.0);

glutSolidCube(1.0);

glScalef(1.0/12.0, 1.0/2.0, 1.0/4.0);

glPushMatrix(); //手掌

glTranslatef(6.0, 0.0, 0.0);

glRotatef(rotWrist, 0.0, 0.0, 1.0);

glTranslatef(3.0, 0.0, 0.0);

glScalef(6.0, 1.0, 4.0);

glutSolidCube(1.0);

glScalef(1.0/6.0, 1.0, 1.0/4.0);

glPushMatrix(); //拇指与手腕相联的关节

glTranslatef(-1.0, 0.0, -1.0);

glRotatef(-rotFinger10, 0.0, 0.0, 1.0);

glRotatef(rotFinger10, 1.0, 0.0, 0.0);

glTranslatef(-1.0, 0.0, -2.0);

glScalef(1.0, 1.0, 2.0);

glutSolidCube(1.0);

glScalef(1.0, 1.0, 1.0/2.0);

glPushMatrix(); //拇指上的关节

glTranslatef(0.0, 0.0, -1.0);

glRotatef(rotFinger11, 1.0, 0.0, 0.0);

glTranslatef(0.0, 0.0, 0.0);

glScalef(1.0, 1.0, 2.0);

glutSolidCube(1.0);

glPopMatrix();

glPopMatrix();

glPushMatrix(); //食指与手腕相联的关节

glTranslatef(3.0, 0.0, -1.5);

glRotatef(rotFinger20, 0.0, 0.0, 1.0);

glTranslatef(1.0, 0.0, 0.0);

glScalef(2.0, 1.0, 1.0);

glutSolidCube(1.0);

glScalef(1.0/2.0, 1.0, 1.0);

glPushMatrix(); //食指上的关节

glTranslatef(1.0, 0.0, 0.0);

glRotatef(rotFinger21, 0.0, 0.0, 1.0);

glTranslatef(1.25, 0.0, 0.0);

glScalef(2.5, 1.0, 1.0);

glutSolidCube(1.0);

glPopMatrix();//食指关节出栈

glPopMatrix();//食指出栈

/**********************************************************/ glPushMatrix();//中指

glTranslatef(3.0,0.0,-1.5);

glRotatef(rotFinger30, 0.0, 0.0, 1.0);

glTranslatef(1.0,0.0,1.0);

glScalef(2.5,1.0,1.0);

glutSolidCube(1.0);

glScalef(1.0/2.0,1.0,1.0);

glPushMatrix();

glTranslatef(1.0,0.0,0.0);

glRotatef(rotFinger31,0.0,0.0,1.0);

glTranslatef(1.25,0.0,0.0);

glScalef(2.5,1.0,1.0);

glutSolidCube(1.0);

glPopMatrix();

glPopMatrix();

/*************************************************************/ glPushMatrix();//无名指

glTranslatef(3.0,0.0,-1.5);

glRotatef(rotFinger40,0.0,0.0,1.0);

glTranslatef(1.0,0.0,2.0);

glScalef(2.0,1.0,1.0);

glutSolidCube(1.0);

glScalef(1.0/2.0,1.0,1.0);

glPushMatrix();

glTranslatef(1.0,0.0,0.0);

glRotatef(rotFinger41,0.0,0.0,1.0);

glTranslatef(1.25,0.0,0.0);

glScalef(2.5,1.0,1.0);

glutSolidCube(1.0);

glPopMatrix();

glPopMatrix();

/***************************************************************/ glPushMatrix();//小指

glTranslatef(3.0,0.0,-1.5);

glRotatef(rotFinger50,0.0,0.0,1.0);

glTranslatef(1.0,0.0,3.0);

glScalef(1.5,1.0,1.0);

glutSolidCube(1.0);

glScalef(1.0/1.5,1.0,1.0);

glPushMatrix();

glTranslatef(1.0,0.0,0.0);

glRotatef(rotFinger51,0.0,0.0,1.0);

glTranslatef(1.25,0.0,0.0);

glScalef(2.5,1.0,1.0);

glutSolidCube(1.0);

glPopMatrix();

glPopMatrix();

/************************************************************/

glPopMatrix();//手掌出栈

glPopMatrix();//上臂出栈

glPopMatrix();//整个手臂出栈

glutSwapBuffers();//交换缓冲区

}

void keyboard(GLubyte key, GLint x, GLint y)

{

//小写字母减少旋转度数,大写字母增加

switch(key) {

//肩

case 'a':

If(rotShoulder>-45.0)

rotShoulder -= 5.0;

glutPostRedisplay();//程序改变窗口的内容 break;

case 'A':

if(rotShoulder<90.0)

rotShoulder += 5.0;

glutPostRedisplay();

break;

//肘

case 's':

if(rotElbow>0.0)

rotElbow -= 5.0;

glutPostRedisplay();

break;

case 'S':

if(rotElbow<160.0)

rotElbow += 5.0;

glutPostRedisplay();

break;

//腕

case 'd':

if(rotWrist>-80.0)

rotWrist -= 5.0;

glutPostRedisplay(); break;

case 'D':

if(rotWrist<80.0)

rotWrist += 5.0;

glutPostRedisplay(); break;

//拇指

case 'g':

if(rotFinger10>0.0) rotFinger10 -= 5.0; glutPostRedisplay(); break;

case 'G':

if(rotFinger10<90.0) rotFinger10 += 5.0; glutPostRedisplay(); break;

case 't':

if(rotFinger11>0.0) rotFinger11 -= 5.0; glutPostRedisplay(); break;

case 'T':

if(rotFinger11<90.0) rotFinger11 += 5.0;

glutPostRedisplay(); break;

//食指

case 'h':

if(rotFinger20>0.0) rotFinger20 -= 5.0; glutPostRedisplay(); break;

case 'H':

if(rotFinger20<90.0) rotFinger20 += 5.0; glutPostRedisplay(); break;

case 'y':

if(rotFinger21>0.0) rotFinger21 -= 5.0; glutPostRedisplay(); break;

case 'Y':

if(rotFinger21<90.0) rotFinger21 += 5.0; glutPostRedisplay(); break;

case 'j':

if(rotFinger30>0.0) rotFinger30 -= 5.0; glutPostRedisplay();

break;

case 'J':

if(rotFinger30<90.0) rotFinger30 += 5.0; glutPostRedisplay(); break;

case 'u':

if(rotFinger31>0.0) rotFinger31 -= 5.0; glutPostRedisplay(); break;

case 'U':

if(rotFinger31<90.0) rotFinger31 += 5.0; glutPostRedisplay(); break;

case 'k':

if(rotFinger40>0.0) rotFinger40 -= 5.0; glutPostRedisplay(); break;

case 'K':

if(rotFinger40<90.0) rotFinger40 += 5.0; glutPostRedisplay(); break;

case 'i':

if(rotFinger41>0.0) rotFinger41 -= 5.0; glutPostRedisplay(); break;

case 'I':

if(rotFinger41<90.0) rotFinger41 += 5.0; glutPostRedisplay(); break;

case 'l':

if(rotFinger50>0.0) rotFinger50 -= 5.0; glutPostRedisplay(); break;

case 'L':

if(rotFinger50<90.0) rotFinger50 += 5.0; glutPostRedisplay(); break;

case 'o':

if(rotFinger51>0.0) rotFinger51 -= 5.0; glutPostRedisplay(); break;

case 'O':

if(rotFinger51<90.0) rotFinger51 += 5.0;

glutPostRedisplay();

break;

default:

break;

}

}

int main(int argc, char** argv)

{//五步初始化窗口的模式调用

glutInit(&argc, argv);//初始化glut和任何命令线的参数

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);//用双缓存,rgba颜色模式,深度缓存

glutInitWindowPosition(200, 100);//指定屏幕左上点位置

glutInitWindowSize(400, 300);//用像素指定大小

glutCreateWindow("机器人手臂");//直到glutMainLoop()被调用,此窗口开始

被调用了

init();

glutDisplayFunc(display);

//glutDisplayFunc(void (*func)(void))是第一个也是最重要的回调函数,不断

要重复的函数就放在这里

glutReshapeFunc(reshape);

//回调函数,当你初始打开一个窗口或者之后移动或者重新定义大小,窗口

会发送一个外部事件来通知你

//重新建立有新画布的矩形区

//定义物体将被画的坐标系统

glutKeyboardFunc(keyboard);//调用键盘的函数

glutMainLoop();

return 0;

四、总结

4.1、经验总结

总结在原理理解、程序设计中所遇到的困难是如何解决的,可以举出1至2个例子。问题分为3类,一类是大方向问题,比如一开始编程序时连OpenGL用VC编都不知道,这时去问下老师是比较快的方法。听了老师的建议后,对自己做的东西拿捏就比较准,不至于盲目的前进。问了老师以后,老师只是大方向给了提示,具体还是要自己做,就快速的看一些相关的书,这里的快速不是细细钻研,而是快速的学习。书上给的程序和自己项目有关的就快速的用。差不多如此就可以大概的完成程序,毕竟我们的目的是完成程序,而不是搞研究,这样基本就可以完成了。

大程序完成后就一般会有第二类问题,是自己创新的问题。因为是自己的东西,所以一定要有创新,要加一些自己的东西。这时就要对程序有个比较深入的了解了。细细研究一下程序的算法等等,问问老师,多和同学交流,上网看高手的博客,或者在群里讨论,有时候别人的一句话就可能让你恍然大悟。不然很多时候浪费时间最多的技术卡壳也一般是由这类问题产生的。

第三类问题是细节问题,一般就是函数的参数调用的问题或者一些琐碎的技术问题。可以多借助网络,专业群等方法得到答案。

4.2、程序结构优缺分析

对技术方法的评价:在开发的过程中是由浅到深的进行开发,先争取实现基本功能,之后再进一步实现扩展功能。具体来说,首先编写我们已经掌握到

了的知识,然后再添加一些通过查阅资料得到的知识要点,之后再添加核心的

功能,最后再增加扩展功能,在整体调试时,出现了很多问题,甚至使程序不

能运行的问题,所以这也是遇到的最大障碍。而主要的所有困难来源是对于C++

语言和OpenGL的不够熟悉和一些错误的认识,我几乎是一边熟悉编译环境,熟

悉C++,熟悉OpenGL,一边进行的项目走了不少弯路,但是也从中获得了很多

的知识。但是无论之前怎样,最终实现了基本功能就是一种成功这也比较锻炼

我们的能力。

4.3、出错原因的分析

本次实验通过OPENGL制作的,由于之前对于OPENGL并不十分了解,也对C++并不十分了解,所以在写程序的过程中遇到了很多不应该有的低级错误,由于动手过程并不十分多,所以对于错误的修改也并不十分在行,所以致使遇到了很多错误。同时,对于图形学的理解也并不十分透彻,有些地方由于理解性错误和习惯思维,致使走了比较多弯路。

4.4、心得体会

通过计算机图形学的实验使我对所学知识有了更加清晰的认识也是对所学知识的巩固,实验不仅是将所学知识形象化、实践化、将理论和实际结合起来,也是对自身知识掌握程度的深刻考验,在实验中提高了自己的动手水平和思考能力,也让自己能在实验中检验和现自己的不足之处,可以使自己受益颇深。

五、参考资料:

1.杨旭等. Visual C++编程篇[M].北京:电子工业出版社, 2004.

2.朱亚平等. OpenGL编程实例[M].北京:人民邮电出版社,1999.

3.倪明田,吴良芝. 计算机图形学[M]. 北京:北京大学出版社,2000.

4.彭达等. Visual C++多媒体编程技术[M]. 北京:人民邮电出版社,1999.

计算机图形学试题附答案完整版

名词解释 将图形描述转换成用像素矩阵表示的过程称为扫描转换。 1.图形 2.像素图 3.参数图 4.扫描线 5.构造实体几何表示法 6.投影 7.参数向量方程 8.自由曲线 9.曲线拟合 10.曲线插值 11.区域填充 12.扫描转换 三、填空 1.图形软件的建立方法包括提供图形程序包、和采用专用高级语言。 2.直线的属性包括线型、和颜色。 3.颜色通常用红、绿和蓝三原色的含量来表示。对于不具有彩色功能的显示系统,颜色显示为。 4.平面图形在内存中有两种表示方法,即和矢量表示法。 5.字符作为图形有和矢量字符之分。 6.区域的表示有和边界表示两种形式。 7.区域的内点表示法枚举区域内的所有像素,通过来实现内点表示。 8.区域的边界表示法枚举区域边界上的所有像素,通过给赋予同一属性值来实现边界表示。 9.区域填充有和扫描转换填充。 10.区域填充属性包括填充式样、和填充图案。 11.对于图形,通常是以点变换为基础,把图形的一系列顶点作几何变换后,

连接新的顶点序列即可产生新的变换后的图形。 12.裁剪的基本目的是判断图形元素是否部分或全部落在之内。 13.字符裁剪方法包括、单个字符裁剪和字符串裁剪。 14.图形变换是指将图形的几何信息经过产生新的图形。 15.从平面上点的齐次坐标,经齐次坐标变换,最后转换为平面上点的坐标,这一变换过程称为。 16.实体的表面具有、有界性、非自交性和闭合性。 17.集合的内点是集合中的点,在该点的内的所有点都是集合中的元素。 18.空间一点的任意邻域内既有集合中的点,又有集合外的点,则称该点为集合的。 19.内点组成的集合称为集合的。 20.边界点组成的集合称为集合的。 21.任意一个实体可以表示为的并集。 22.集合与它的边界的并集称集合的。 23.取集合的内部,再取内部的闭包,所得的集合称为原集合的。 24.如果曲面上任意一点都存在一个充分小的邻域,该邻域与平面上的(开)圆盘同构,即邻域与圆盘之间存在连续的1-1映射,则称该曲面为。 25.对于一个占据有限空间的正则(点)集,如果其表面是,则该正则集为一个实体(有效物体)。 26.通过实体的边界来表示一个实体的方法称为。 27.表面由平面多边形构成的空间三维体称为。 28.扫描表示法的两个关键要素是和扫描轨迹。 29.标量:一个标量表示。 30.向量:一个向量是由若干个标量组成的,其中每个标量称为向量的一个分量。 四、简答题 1. 什么是图像的分辨率?

计算机图形学真实图形

#include #include /* Initialize material property, light source, lighting model, * and depth buffer. */ void init(void) { GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; GLfloat lightPos[]={0.0f,0.0f,75.0f,1.0f}; GLfloat ambientLight[]={0.0f,0.0f,75.0f,1.0f}; GLfloat specular[]={0.0f,0.0f,75.0f,1.0f}; GLfloat specref[]={0.0f,0.0f,75.0f,1.0f}; GLfloat spotDir[]={0.0f,0.0f,75.0f,1.0f}; glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH);//设置阴影模型 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);//镜面光分量强度glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//镜面光反射指数glLightfv(GL_LIGHT0, GL_POSITION, light_position);//设置光源的位置 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight); glLightfv(GL_LIGHT1,GL_DIFFUSE,ambientLight); glLightfv(GL_LIGHT1,GL_SPECULAR,specular); glLightfv(GL_LIGHT1,GL_POSITION,lightPos); glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,50.0f); glEnable(GL_LIGHT1); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT,GL_SPECULAR,specref); glMateriali(GL_FRONT,GL_SHININESS,128); glEnable(GL_LIGHTING);//启动光照 glEnable(GL_LIGHT0);//激活光源 glEnable(GL_LIGHT1);//激活光源 glEnable(GL_DEPTH_TEST); } /* 调用glut函数绘制一个球*/ void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

计算机图形学实验

实验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 ;

计算机图形学基础期末考试试题

一、填空题 1.将多边形外部一点A与某一点B用线段连接,若此线段与多边形边界相交的次数为??????????,则点B在多边形外部。若此线段与多边形边界相交的次数为??????????,则点B在多边形内部。 2.生成直线的四点要求是_______________________,____________________________,____________________________________,速度要快。 3.由5个控制顶点Pi(i=0,1,…4)所决定的3次B样条曲线,由??????????段3次B样条曲线段光滑连接而成。 4.用于减少或克服在“光栅图形显示器上绘制直线、多边形等连续图形时,由离散量表示连续量引起的失真”的技术叫??????????。 5.图形的数学表示法一般有??????????,??????????,??????????。 1.一个交互性的计算机图形系统应具有、、、、 输入等五方面的功能。 2.阴极射线管从结构上可以分为、和。 3.常用的图形绘制设备有和,其中支持矢量格式。 4.PHIGS和GKS将各种图形输入设备从逻辑上分为六种:定位设备、笔划设 备、、、和。 5.通常可以采用和处理线宽。 6.齐次坐标表示就是用维向量表示n维向量。 7.平行投影根据可以分为投影和投影。 8.一个交互式计算机图形处理系统包括图形软件和_____________,图形软件又分为 _____________、_____________和三部分。 9.构成图形的要素包括和,在计算机中通常用采用两种方法来表示 图形,他们是和。 10.荫罩式彩色显像管的结构包括、、和。 11.目前常用的PC图形显示子系统主要由3个部件组成:、和一 个ROM BIOS芯片。 12.在交互输入过程中,图形系统中有_____________、、和其组 合形式等几种输入(控制)模式。 13.填充一个特定区域,其属性选择包括、和。 14.计算机中表示带有颜色及形状信息的图和形常用和参数法,其中用参数法描 述的图形称为,用描述的图形称为。 15.在显示技术中,我们常常采用提高总的光强等级。 16.常用的交互式绘图技术有、、和。

计算机图形学上机实验4_实现Bezier曲线和Bezier曲面的绘制

昆明理工大学理学院 信息与计算科学专业操作性实验报告 年级: 10级姓名:刘陈学号: 201011101128 指导教师: 胡杰 实验课程名称:计算机图形学程序设计开课实验室:理学院机房216 实验内容: 1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时 3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机 (2)软件:windows OS,VC++6.0或以上版本。 试验内容及步骤: (1)在VC++环境下创建MFC应用程序工程(单文档) (2)编辑菜单资源 (3)添加菜单命令消息处理函数 (4)添加成员函数 (5)编写函数内容 试验要求: (1)掌握Bezier曲线、Bezier曲面、及另一个曲面的算法。 (2)实现对Bezier曲线、Bezier曲面、及另一个曲面。 (3)试验中调试、完善所编程序,能正确运行出设计要求结果。 (4)书写试验报告上交。 4.程序结构(程序中的函数调用关系图)

5.算法描述、流程图或操作步骤: 在lab4iew.cpp文件中添加如下头文件及变量 int flag_2=0; int n_change; #define M 30 #define PI 3.14159 //圆周率 #include "math.h" //数学头文件 在lab4iew.h文件中的public内添加变量: int move; int graflag; void Tiso(float p0[3],float x0, float y0, float p[3]); void OnBezierface(); 在lab4iew.h文件中的protected内添加变量: int n;//控制点数 const int N;//控制点数的上限 CPoint* a;//控制点存放的数组 double result[4][2]; 在lab4iew.cpp文件中的函数Clab4iew::OnDraw(CDC* pDC)下添加如下代码: int i,j; for(i=0;iFillSolidRect(a[i].x-2,a[i].y-2,4,4,RGB(255,55,255)); } pDC->MoveTo(a[0]);

计算机图形学——绘制Bezier曲线

计算机图形学 实验报告 专业:信息与计算科学 班级: 1002班 学号: 1008060*** 姓名: ****

实验目的: (1)掌握直线的参数表示法。 (2)掌握德卡斯特里奥算法的几何意义。 (3)掌握绘制二维Bezier曲线的方法。 实验要求: (1)使用鼠标左键绘制个数为10以内的任意控制点,使用直线连接构成控制多边形。 (2)使用鼠标右键绘制Bezier曲线。 (3)在状态栏显示鼠标的位置坐标。 (4)B ezier曲线使用德卡斯特里奥算法绘制。 实验算法: Bezier曲线的分割递推德卡斯特里奥算法 给定空间n+1个点P i(i=0,1,2,…,n)及参数t,有 P r i(t)=(1-t)P1-r i(t)+t P1-r1i+(t) 式中,r=1,2,…,n;i=0,1,…,n-r;t∈[0,1]。 且规定当r=0时,P0i(t)=P i, P n0(t)是在曲线上具有参数t的点。 德卡斯特里奥算法的基础就是在矢量? ?→ ? P P10 上选择一个点P,使 得P点划分矢量? ?→ ? P P10为|P P0|:|P P1|=t:1-t,给定点P0、P1 的坐标以及t的值,点P的坐标为P=P0+t(P1-P0)=(1-t)P0+tP1。式中,t∈[0,1]。 定义贝塞尔曲线的控制点编号为P r i,其中,r表示迭代次数。德卡斯特里奥证明了,当r=n时,P n0表示Bezier曲线上的点。

函数功能介绍 1.德卡斯特里奥函数: long CMy12View::DeCasteliau(double t,long *p) { double P[N_MAX_POINT][N_MAX_POINT]; int n=CtrlPNum-1; for(int k=0;k<=n;k++) { P[0][k]=p[k]; } for(int r=1;r<=n;r++) { for(int i=0;i<=n-r;i++) { P[r][i]=(1-t)*P[r-1][i]+t*P[r-1][i+1]; } } return(long(P[n][0])); } 函数功能介绍:此函数为德卡斯特里奥算法函数。在绘制Bezier 曲线时,需调用两次此函数,分别关于x方向和y方向上的调用。由DrawBezier()函数调用。 2. void CMy12View::DrawBezier() 函数功能介绍:此函数为绘制Bezier曲线。绘制二维Bezier曲线,需要对x方向和y方向进行计算。这个函数就是解决这个问题,然后通过OnRButtonDown(UINT nFlags,CPoint point)调用进行绘制。 3 .void CMy12View::DrawCtrPolygon() 函数功能介绍:此函数为绘制控制多边形。定义一个CPen型NewPen,和CPen*型PoldPen,进行绘制多边形,为了突出控制点,使用黑色填充边长为4个像素的正方形块代表控制点。 4. void CMy12View::OnLButtonDown(UINT nFlags,CPoint point) 函数功能介绍:此函数为鼠标左键按下函数。按下鼠标左键,将鼠

计算机图形学必考知识点

Phong Lighting 该模型计算效率高、与物理事实足够接近。Phong模型利用4个向量计算表面任一点的颜色值,考虑了光线和材质之间的三种相互作用:环境光反射、漫反射和镜面反射。Phong模型使用公式:I s=K s L s cosαΦα:高光系数。计算方面的优势:把r和v归一化为单位向量,利用点积计算镜面反射分量:I s=K s L s max((r,v)α,0),还可增加距离衰减因子。 在Gouraud着色这种明暗绘制方法中,对公用一个顶点的多边形的法向量取平均值,把归一化的平均值定义为该顶点的法向量,Gouraud着色对顶点的明暗值进行插值。Phong着色是在多边形内对法向量进行插值。Phong着色要求把光照模型应用到每个片元上,也被称为片元的着色。 颜色模型RGB XYZ HSV RGB:RGB颜色模式已经成为现代图形系统的标准,使用RGB加色模型的RGB三原色系统中,红绿蓝图像在概念上有各自的缓存,每个像素都分别有三个分量。任意色光F都可表示为F=r [ R ] + g [ G ] + b [ B ]。RGB颜色立方体中沿着一个坐标轴方向的距离代表了颜色中相应原色的分量,原点(黑)到体对角线顶点(白)为不同亮度的灰色 XYZ:在RGB 系统基础上,改用三个假想的原色X、Y、Z建立了一个新的色度系统, 将它匹配等能光谱的三刺激值,该系统称为视场XYZ色度系统,在XYZ空间中不能直观地评价颜色。 HSV是一种将RGB中的点在圆柱坐标系中的表示法,H色相S饱和度V明度,中心轴为灰色底黑顶白,绕轴角度为H,到该轴距离为S,沿轴高度为S。 RGB优点:笛卡尔坐标系,线性,基于硬件(易转换),基于三刺激值,缺点:难以指定命名颜色,不能覆盖所有颜色范围,不一致。 HSV优点:易于转换成RGB,直观指定颜色,’缺点:非线性,不能覆盖所有颜色范围,不一致 XYZ:覆盖所有颜色范围,基于人眼的三刺激值,线性,包含所有空间,缺点:不一致 交互式计算机程序员模型 (应用模型<->应用程序<->图形库)->(图形系统<->显示屏).应用程序和图形系统之间的接口可以通过图形库的一组函数来指定,这和接口的规范称为应用程序编程人员接口(API),软件驱动程序负责解释API的输出并把这些数据转换为能被特定硬件识别的形式。API提供的功能应该同程序员用来确定图像的概念模型相匹配。建立复杂的交互式模型,首先要从基本对象开始。良好的交互式程序需包含下述特性:平滑的显示效果。使用交互设备控制屏幕上图像的显示。能使用各种方法输入信息和显示信息。界面友好易于使用和学习。对用户的操作具有反馈功能。对用户的误操作具有容忍性。Opengl并不直接支持交互,窗口和输入函数并没有包含在API中。 简单光线跟踪、迭代光线跟踪 光线跟踪是一种真实感地显示物体的方法,该方法由Appel在1968年提出。光线跟踪方法沿着到达视点的光线的相反方向跟踪,经过屏幕上每一象素,找出与视线所交的物体表面点P0,并继续跟踪,找出影响P0点光强的所有的光源,从而算出P0点上精确的光照强度。光线跟踪器最适合于绘制具有高反射属性表面的场景。优缺点:原理简单,便于实现,能生成各种逼真的视觉效果,但计算量开销大,终止条件:光线与光源相交光线超出视线范围,达到最大递归层次。一般有三种:1)相交表面为理想漫射面,跟踪结束。2)相交表面为理想镜面,光线沿镜面反射方向继续跟踪。3)相交表面为规则透射面,光线沿规则透射方向继续跟踪。 描述光线跟踪简单方法是递归,即通过一个递归函数跟踪一条光线,其反射光想和折射光线再调用此函数本身,递归函数用来跟踪一条光线,该光线由一个点和一个方向确定,函数返回与光线相交的第一个对象表面的明暗值。递归函数会调用函数计算指定的光线与最近对象表面的交点位置。 图形学算法加速技术BVH, GRID, BSP, OCTree 加速技术:判定光线与场景中景物表面的相对位置关系,避免光线与实际不相交的景物表面的求交运算。加速器技术分为以下两种:Bounding Volume Hierarchy 简写BVH,即包围盒层次技术,是一种基于“物体”的场景管理技术,广泛应用于碰撞检测、射线相交测试之类的场合。BVH的数据结构其实就是一棵二叉树(Binary Tree)。它有两种节点(Node)类型:Interior Node 和Leaf Node。前者也是非叶子节点,即如果一个Node不是Leaf Node,它必定是Interior Node。Leaf Node 是最终存放物体/们的地方,而Interior Node存放着代表该划分(Partition)的包围盒信息,下面还有两个子树有待遍历。使用BVH需要考虑两个阶段的工作:构建(Build)和遍历(Traversal)。另一种是景物空间分割技术,包括BSP tree,KD tree Octree Grid BSP:二叉空间区分树 OCTree:划分二维平面空间无限四等分 Z-buffer算法 算法描述:1、帧缓冲器中的颜色设置为背景颜色2、z缓冲器中的z值设置成最小值(离视点最远)3、以任意顺序扫描各多边形a) 对于多边形中的每一个采样点,计算其深度值z(x,y) b) 比较z(x, y)与z缓冲器中已有的值zbuffer(x,y)如果z(x, y) >zbuffer(x, y),那么计算该像素(x, y)的光亮值属性并写入帧缓冲器更新z缓冲器zbuffer(x, y)=z(x, y) Z-buffer算法是使用广泛的隐藏面消除算法思想为保留每条投影线从COP到已绘制最近点距离,在投影后绘制多边形时更新这个信息。存储必要的深度信息放在Z缓存中,深度大于Z缓存中已有的深度值,对应投影线上已绘制的多边形距离观察者更近,故忽略该当前多边形颜色,深度小于Z缓存中的已有深度值,用这个多边形的颜色替换缓存中的颜色,并更新Z缓存的深度值。 void zBuffer() {int x, y; for (y = 0; y < YMAX; y++) for (x = 0; x < XMAX; x++) { WritePixel (x, y, BACKGROUND_VALUE); WriteZ (x, y, 1);} for each polygon { for each pixel in polygon’s projection { //plane equation doubl pz = Z-value at pixel (x, y); if (pz < ReadZ (x, y)) { // New point is closer to front of view WritePixel (x, y, color at pixel (x, y)) WriteZ (x, y, pz);}}}} 优点:算法复杂度只会随着场景的复杂度线性增加、无须排序、适合于并行实现 缺点:z缓冲器需要占用大量存储单元、深度采样与量化带来走样现象、难以处理透明物体 着色器编程方法vert. frag 着色器初始化:1、将着色器读入内存2、创建一个程序对象3、创建着色器对象4、把着色器对象绑定到程序对象5、编译着色器6、将所有的程序连接起来7、选择当前的程序对象8、把应用程序和着色器之间的uniform变量及attribute变量关联起来。 Vertex Shader:实现了一种通用的可编程方法操作顶点,输入主要有:1、属性、2、使用的常量数据3、被Uniforms使用的特殊类型4、顶点着色器编程源码。输入叫做varying变量。被使用在传统的基于顶点的操作,例如位移矩阵、计算光照方程、产生贴图坐标等。Fragment shader:计算每个像素的颜色和其他属性,实现了一种作用于片段的通用可编程方法,对光栅化阶段产生的每个片段进行操作。输入:Varying 变量、Uniforms-用于片元着色器的常量,Samples-用于呈现纹理、编程代码。输出:内建变量。 观察变换 建模变换是把对象从对象标架变换到世界标架 观察变换把世界坐标变换成照相机坐标。VC是与物理设备无关的,用于设置观察窗口观察和描述用户感兴趣的区域内部分对象,观察坐标系采用左手直角坐标系,可在用户坐标系中的任何位置、任何方向定义。其中有一坐标轴与观察方向重合同向并与观察平面垂直。观察变换是指将对象描述从世界坐标系变换到观察坐标系的过程。(1):平移观察坐标系的坐标原点,与世界坐标系的原点重合,(2):将x e,y e轴分别旋转(-θ)角与x w、y w轴重合。 规范化设备坐标系 规范化设备坐标系是与具体的物理设备无关的一种坐标系,用于定义视区,描述来自世界坐标系窗口内对象的图形。 光线与隐式表面求交 将一个对象表面定义为f(x,y,z)=f(p)=0,来自P0,方向为d的光线用参数的形式表示为P(t)=P0+td. 交点位置处参数t的值满足:f(P0+td)=0,若f是一个代数曲面,则f是形式为X i Y j Z k的多项式之和,求交就转化为寻求多项式所有根的问题,满足的情况一:二次曲面,情况二:品面求交,将光线方程带入平面方程:p*n+c=0可得到一个只需做一次除法的标量方程p=p0+td。可通过计算得到交点的参数t的值:t=(p0*n+c)/(n*d). 几何变换T R S矩阵表示 三维平移T 三维缩放S旋转绕z轴Rz( ) 100dx 010dy 001dz 0001 Sx000 0Sy00 00Sz0 0001 cos-sin00 sin cos00 0010 0001 θθ θθ 旋转绕x轴Rx(θ) 旋转绕y轴Ry(θ) 1000 0cos-sin0 0sin cos0 0001 θθ θθ cos0sin0 0100 -sin0cos0 0001 θθ θθ 曲线曲面 Bezier曲线性质:Bezier曲线的起点和终点分别是特征多边形的第一个顶点和最后一个顶点。曲线在起点和终点处的切线分别是特征多边形的第一条边和最后一条边,且切矢的模长分别为相应边长的n倍;(2)凸包性;(3)几何不变性(4)变差缩减性。端点插值。 均匀B样条曲线的性质包括:凸包性、局部性、B样条混合函数的权性、连续性、B样条多项式的次数不取决于控制函数。 G连续C连续 C0连续满足:C1连续满足: (1)(0) p(1)=(1)(0)(0) (1)(0) px qx py q qy pz qz == ???? ???? ???? ???? (1)(0) p'(1)=(1)'(0)(0) (1)(0) p x q x p y q q y p z q z == ???? ???? ???? ???? C0(G0)连续:曲线的三个分量在连接点必须对应相等 C1连续:参数方程和一阶导数都对应相等 G1连续:两曲线的切线向量成比例 三维空间中,曲线上某点的导数即是该点的切线,只要求两个曲线段连接点的导数成比例,不需要导 数相等,即p’(1)=aq’(0) 称为G1几何连续性。将该思想推广到高阶导数,就可得到C n和G n连续性。

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[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日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学

a.扫描线算法:目标:利用相邻像素之间的连贯性,提高算法效率。处理对象:简单多边形,非自交多边形(边与边之间除了顶点外无其它交点)。扫描线:平行于坐标轴的直线,一般取平行于X轴。区间:扫描线与边的交点间的线段。基本原理:将整个绘图窗口内扫描多边形的问题分解到一条条扫描线,只要完成每条扫描线的绘制就实现了多边形的扫描转换;一条扫描线与多边形的边有偶数个交点,每2个点形成一区间。步骤:(对于每一条扫描线)(1)计算扫描线与边的交点(2)交点按x坐标从小到大排序(3)交点两两配对,填充区间。算法:1、建立ET;2、将扫描线纵坐标y的初值置为ET中非空元素的最小序号,如图中,y=1;3、置AEL为空;4、执行下列步骤直至ET和AEL都为空.4.1、如ET中的第y类非空,则将其中的所有边取出并插入AEL 中;4.2、如果有新边插入AEL,则对AEL中各边排序;4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,…),将每对边中x坐标按规则取整,获得有效的填充区段,再填充.4.4、将当前扫描线纵坐标 y 值递值1;4.5、将AEL中满足y = ymax边删去(因为每条边被看作下闭上开的);4.6、对AEL中剩下的每一条边的x 递增deltax,即x = x+deltax. b.走样与反走样:走样:用离散量(像素)表示连续的量(图形)而引起的失真,称为走样,或称为混淆。光栅图形的走样现象:阶梯(锯齿)状边界、图形细节失真、狭小图形遗失:动画序列中时隐时现,产生闪烁。反走样:在图形显示过程中,用于减少或消除走样(混淆)现象的方法。方法:提高分辨率方法{方法简单,但代价非常大,显示器的水平、竖直分辩率各提高一倍,则显示器的点距减少一倍,帧缓存容量则增加到原来的4倍,而扫描转换同样大小的图元却要花4倍时间}、非加权区域采样{扫描转换线段的两点假设:像素是数学上抽象的点,它的面积为0,它的亮度由覆盖该点的图形的亮度所决定;直线段是数学上抽象直线段,它的宽度为0。而现实:像素的面积不为0;直线段的宽度至少为1个像素;假设与现实的矛盾是导致走样出现的原因之一。解决方法:改变直线段模型,线上像素灰度不等。方法步骤:1、将直线段看作具有一定宽度的狭长矩形;2、当直线段与某像素有交时,求出两者相交区域的面积;3、根据相交区域的面积,确定该像素的亮度值}、加权区域采样{权函数w(x, y),以像素A的中心为原点建立二维坐标系,w(x, y)反应了微面积元dA对整个像素亮度的贡献大小,与 dA 到像素中心距离d 成反比。实现步骤:1.求直线段与像素的相交区域2.计算的值3.上面所得到的值介于0、1之间,用它乘像素的最大灰度值,即设该像素的显示灰度。问题:计算量大。 c.为什么需要齐次坐标? 1、对多个点计算多次不同的变换时,分别利用矩阵计算各变换导致计算量大2、运算表示形式不统一:平移为“+”、旋转和放缩为“·”3、统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象。 d.Sutherland-Hodgman算法:S-H算法基本思想(亦称逐边裁剪算法):将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。步骤:1、多边形由一系列顶点表示:V1V2…Vn2、按一定(左上右下)的次序依次裁剪; 与左边所在直线裁剪

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

《计算机图形学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];

计算机图形学课程设计

《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法 专业计算机科学与技术 班级计科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 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。 网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。 当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。 球面的参数方程为:

计算机图形学课程设计报告简单图形的绘制-

《计算机图形学》课程设计 报告 学生姓名:学号: 学院: 班级: 题目: 简单图形的绘制 职称2015年7月1日

目录 目录............................................................................................... I 一、选题背景 (1) 二、算法设计 (2) 2.1 绘制直线、圆、椭圆、抛物线 (2) 2.1.1 绘制直线 (2) 2.1.2 绘制圆 (2) 2.1.3 绘制椭圆 (2) 2.1.4 绘制抛物线 (2) 2.2 三维几何变换 (2) 三、程序及功能说明 (5) 3.1 绘制直线、圆、椭圆、抛物线...... (5) 3.1.1 绘制直线 (5) 3.1.2 绘制圆 (5) 3.1.3 绘制椭圆 (5) 3.1.4 绘制抛物线 (6) 3.2 图形的平移 (6) 3.3 图形的旋转 (6) 3.4 图形的缩放 (7) 四、结果分析 (7) 4.1 绘制直线、圆、椭圆、抛物线 (7) 4.1.1 直线 (7) 4.1.2 圆 (8)

4.1.3 椭圆 (8) 4.1.4 抛物线 (8) 4.2 图形的平移 (9) 4.3 图形的旋转 (10) 4.4 图形的缩放 (11) 五、总结 (10) 六、课程设计心得体会 (14) 参考文献 (15) 源程序 (16)

一、选题背景

二、算法设计 2.1 绘制直线、圆、椭圆、抛物线 2.1.1 绘制直线 通过两个点的坐标来绘制直线。计算机图形学中二维图形在显示输出之前需要扫描转换,生成直线的算法一般有DDA 算法和中点算法。 2.1.2 绘制圆 通过运用圆的参数方程cos ;sin x a r y b r θθ=+=+来绘制圆的图形,其中[0,2]θπ∈, (a,b )为圆心,r 为半径,运用参数方程,只需要确定半径的长度和圆心的位置,即可绘制出圆。 2.1.3 绘制椭圆 通过运用椭圆的参数方程cos ;sin x a y b θθ==来绘制椭圆的图形,其中 [0,2]θπ∈,是已知的变量,a ,b 分别为长半轴,短半轴,当确定a 和b 后,通过参数方程即可得到这个椭圆的方程。 2.1.4 绘制抛物线 根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。 2.2 三维几何变换 三维几何变换是二维几何变换的推广。二维几何变换在齐次坐标空间中 可用3?3的变换矩阵表示,类似的,三维几何变换在齐次坐标空间中可用4?4的变换矩阵表示。三维空间中的点(),,x y z 的齐次坐标定义为(),,h h h x y z ,其中,h 为不等与零的任意常数,h x hx =,h y hy =,h z hz =。亦即点(),,x y z 对应4维齐次坐标空间的一条直线:

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

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

实验一实现任意直线的中点画线算法 【实验目的】 掌握直线的中点画线算法; 【实验环境】 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

计算机图形学简单画图代码

软件:NetBeans 图形效果: 代码: package newpackage; import java.awt.*; import javax.swing.*; import java.awt.geom.*; import java.awt.image.*; import https://www.360docs.net/doc/766490732.html,.URL; import java.io.*; import javax.imageio.*; import java.awt.event.*; import java.util.Calendar; import javax.swing.*; public class Hello2D extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("计算机图形学"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new Hello2D(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }

public void init() { JPanel panel = new Hello2DPanel(); getContentPane().add(panel); } } class Hello2DPanel extends JPanel implements ActionListener{ private BufferedImage image; AffineTransform rotH = new AffineTransform(); AffineTransform rotM = new AffineTransform(); AffineTransform rotS = new AffineTransform(); // AffineTransform zuq=new AffineTransform (); public Hello2DPanel() { setPreferredSize(new Dimension(1400,1000)); setBackground(Color.white); Timer timer=new Timer(500,this); timer.start(); URL url=getClass().getClassLoader().getResource("images/zuqiu.jpg"); try{ image=ImageIO.read(url); }catch(IOException ex) { ex.printStackTrace(); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2= (Graphics2D)g; g2.translate(100,100); g2.scale(0.5, 0.5); for (int i = 0; i < 12; i++) { g2.rotate(2*Math.PI/12); g2.fill3DRect(-3, -180, 6, 30, true); }

相关文档
最新文档