文档库 最新最全的文档下载
当前位置:文档库 › 计算机图形学大作业报告(灯光纹理映射)

计算机图形学大作业报告(灯光纹理映射)

计算机图形学大作业报告(灯光纹理映射)
计算机图形学大作业报告(灯光纹理映射)

大作业报告

实验课程名称:计算机图形学

学生姓名:

班级:

学院(系):学生学号:

指导教师:成绩:

一、目的

这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。

二、主要功能模块设计

1 矩阵运算模块的设计:

功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。

代码设计:

float vv(float * v1, float * v2){

return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];

}

void vxv(float * n, float * v1, float * v2){

n[0] = v1[1] * v2[2] - v1[2] * v2[1];

n[1] = v1[2] * v2[0] - v1[0] * v2[2];

n[2] = v1[0] * v2[1] - v1[1] * v2[0];

}

void loadIdentity(Matrix m){

Matrix identity = {{1.0,0.0,0.0,0.0},

{0.0,1.0,0.0,0.0},

{0.0,0.0,1.0,0.0},

{0.0,0.0,0.0,1.0}};

for(int i = 0;i < 4; i++)

for(int j = 0;j < 4; j++)

m[i][j] = identity[i][j];

}

void preMultiply(Matrix p, Matrix m){

int i , j;

Matrix t;

for( i = 0; i < 4; i ++)

for( j = 0; j < 4; j++)

t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];

for( i = 0; i < 4; i ++)

for( j = 0; j < 4; j ++)

m[i][j] = t[i][j];

}

2 显示图形模块的设计:

功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。

代码设计:

//2D图形的display函数

void display(){

glClear(GL_COLOR_BUFFER_BIT);

if(n == 1 && type ==GL_LINE_STRIP) {

glBegin(GL_POINTS);

glVertex2iv(vert[0]);

glColor3f(0,0.5,0.5);

glVertex2i(width-vert[0][0]-1,vert[0][1]);

glEnd();

}

glColor3f(0,0.5,0.5);

glBegin(GL_LINES);

glVertex2i(width/2,0);

glVertex2i(width/2,height-1);

glEnd();

glBegin(type);

for(int i = 0;i

glEnd();

glColor3f(1,1,0);

glBegin(type);

for(int i = 0;i

glEnd();

glutSwapBuffers();

initQMesh();

glutSetWindow(winid);

glutPostRedisplay();

}

//3D图形的显示函数

void modelDisplay(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

float M[16];

for(int r = 0; r < 4; r++) for(int c = 0; c < 4; c++) M[4 * c + r] = CRM[r][c];

glMultMatrixf(M);

glScalef(zoom,zoom,zoom);

drawQMesh();

glPopMatrix();

glPushMatrix();

glLightfv(GL_LIGHT0,GL_AMBIENT,amb);

glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

glPopMatrix();

glutSwapBuffers();

}

3 键盘敲击模块

功能描述:该功能主要为两个窗体添加键盘敲击事件,在2D窗体中主要添加了反走样效果,清除所画的图,点线转化功能,对于3D窗体主要添加了投影方式的变换,光源移动

的功能

代码设计:

//2D绘制窗体的键盘敲击处理函数

void keyboard(unsigned char key, int x,int y){

switch(key){

case'a': antialiasing = ! antialiasing;//反走样效果

if(antialiasing){

glEnable(GL_BLEND);

glEnable(GL_LINE_SMOOTH);

}else{

glDisable(GL_BLEND);

glDisable(GL_LINE_SMOOTH);

}

break;

case'c': n = 0;break; //清除界面功能

case'l': type = GL_LINE_STRIP;break; //绘制线功能

case'v': type = GL_POINTS;break; //绘制点功能}

glutPostRedisplay();

}

//3D显示窗体的键盘敲击事件处理函数:

void modelKeyboard(unsigned char key, int x, int y){

switch (key) {

case'o':glMatrixMode(GL_PROJECTION);//正投影

glLoadIdentity();

glOrtho(-4,4,-4,4,6,14);

glMatrixMode(GL_MODELVIEW);

break;

case'p':glMatrixMode(GL_PROJECTION);//侧投影,不过是默认的 glLoadIdentity();

gluPerspective(45.0,1.0,6.0,14.0);

glMatrixMode(GL_MODELVIEW);

break;

case'm':lightPosition[0] = lightPosition[0] - 0.5; //光源移动

break;

case'n':lightPosition[1] = lightPosition[1] - 0.5;

break;

case'z':lightPosition[2] = lightPosition[2] - 0.5;

break;

case'k':glDisable(GL_FOG);

break;

}

glutPostRedisplay();

}

4鼠标点击模块

功能描述:该功能模块主要实现了对两个窗体鼠标事件的处理,对于3D窗体实现了鼠标左键旋转,由键放大缩小的效果,2D窗体实现了左键画点,右键可以对已经存在的点改变它的位置。

代码设计:

//3D窗体的鼠标事件

void modelMouse(int button,int state,int x,int y){

switch (button){

case GLUT_LEFT_BUTTON:

if(state == GLUT_DOWN ){

cx = x;

cy = h - 1 - y;

dx = dy = 0;

left_button_down = true;

}else

left_button_down = false;

break;

case GLUT_RIGHT_BUTTON:

if(state == GLUT_DOWN){

cx = x;

cy = h - 1 - y;

right_button_down = true;

}else

right_button_down = false;

break;

}

}

//2D窗体鼠标事件

void mouse(int button, int state, int x ,int y){

y = height - 1 - y;

switch(button){

case GLUT_LEFT_BUTTON:

if(state == GLUT_DOWN && ! rubberbanding ){

v = n++;

vert[v][0] = (x < width/2) ? width/2: (x >= width) ? width - 1 : x;

vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;

rubberbanding = true;

glutPostRedisplay();

}

else rubberbanding = false;

break;

case GLUT_RIGHT_BUTTON:

if(state == GLUT_DOWN && ! rubberbanding && (v = findVertex(x,y)) != -1) {

if(glutGetModifiers() == GLUT_ACTIVE_CTRL) {

for (int i = v; i< n-1; i++){

vert[v][0] = vert[i+1][0];

vert[i][1] = vert[i+1][1];

}

n--;

}else{

vert[v][0] = (x < width/2) ? width/2 : (x >= width) ? width - 1 : x;

vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;

rubberbanding = true;

}

glutPostRedisplay();

}

else rubberbanding = false;

break;

}

}

功能截图:

利用鼠标在界面上画出原来的图,截图如下:

按住“Z”后,上方的光照变化,截图如下:

按住“Y”后,下方的光照效果发生变化,截图如下:

使用鼠标实现图像方向的变化,截图如下:

使用鼠标实现图像大小的变化,截图如下:

放大:缩小:

三、心得

通过对本次大作业试验的编写,更进一步了解了OpenGL的用法,从计算机图形学课程中可能收获最多的并不是图形学的一些基础知识,虽然这些很重要,但是真正有些成就感的还是用OpenGL开发出来的这些程序。特别是这个项目,和前面几个只需抄抄代码就能出来的实验相比,是需要好好动动脑筋的。在这个项目中需要处理鼠标等设备的输入,然后再根据输入捕捉相应的变化再进行处理。这一块对于我来说是比较困难的。在解决这个问题上花了不少的时间,在解决这个问题之后应当说后面的工作还是比较轻松的。

以前觉得看到的游戏里面的画面很是完美,现在我知道了这写图的制作方法,并且我也学会了怎样制作简单的三维图片,加上对三维图形的一些修饰,使简单的图形变得更好看更精致。

完整代码如下:

#include

#include

#define QMeshSize 256

int width = 400, height = 600, vert[100][2],n = 0,

type = GL_LINE_STRIP,v;

boolrubberbanding = false,antialiasing = false;

floatQMesh[100][QMeshSize+1][3]; GLfloatlightPosition[] = {-4.0,4.0,-6.0,1.0}; GLfloatamb[] = {0.3f,0.3f,0.3f,0.3f}; GLfloatfrontDiffAmb[] = {0.95f,0.3f,0.1f,1.0}; GLfloatbackDiffAmb[] = {0.1f,0.3f,0.95f,1.0}; GLfloatSpec[] = {0.45f,0.45f,0.45f,1.0}; GLfloatSpecExp = 15.0;

boolleft_button_down = false, right_button_down = false; int w = 600, h = 600,winid,

cx,cy,

dx=0,dy=0;

float zoom = 1.0;

typedef float Matrix[4][4];

Matrix RM,CRM;

voidinitQMesh(){

float r;

for(int i = 0; i

r = vert[i][0]-width/2.0;

for(int j = 0; j

QMesh[i][j][0]= r * cos(3.14159 * 2 * j /QMeshSize) / 100;

QMesh[i][j][1]=(vert[i][1] - height/2.0) / 100;

QMesh[i][j][2]=r * sin(3.14159 *2 *j /QMeshSize) / 100;

}

QMesh[i][QMeshSize][0]= QMesh[i][0][0];

QMesh[i][QMeshSize][1]= QMesh[i][0][1];

QMesh[i][QMeshSize][2]= QMesh[i][0][2];

}

}

void display(){

glClear(GL_COLOR_BUFFER_BIT);

if(n == 1 && type ==GL_LINE_STRIP) {

glBegin(GL_POINTS);

glV ertex2iv(vert[0]);

glColor3f(0,0.5,0.5);

glV ertex2i(width-vert[0][0]-1,vert[0][1]);

glEnd();

}

glColor3f(0,0.5,0.5);

glBegin(GL_LINES);

glV ertex2i(width/2,0);

glV ertex2i(width/2,height-1);

glEnd();

glBegin(type);

for(int i = 0;i

glEnd();

glColor3f(1,1,0);

glBegin(type);

for(int i1=0;i1

glEnd();

glutSwapBuffers();

initQMesh();

glutSetWindow(winid);

glutPostRedisplay();

}

void keyboard(unsigned char key, intx,int y){ switch(key){

case 'a': antialiasing = ! antialiasing;

if(antialiasing){

glEnable(GL_BLEND);

glEnable(GL_LINE_SMOOTH);

}else{

glDisable(GL_BLEND);

glDisable(GL_LINE_SMOOTH);

}

break;

case 'c': n = 0;break;

case 'l': type = GL_LINE_STRIP;break;

case 'v': type = GL_POINTS;break;

}

glutPostRedisplay();

}

intfindV ertex(intx,int y){

intdx,dy;

for(int i = 0;i

dx = vert[i][0]-x;

dy = vert[i][1]-y;

if(dx*dx + dy*dy< 16) return i;

}

return -1;

}

void mouse(int button, int state, int x ,int y){

y = height - 1 - y;

switch(button){

case GLUT_LEFT_BUTTON:

if(state == GLUT_DOWN && ! rubberbanding ){

v = n++;

vert[v][0] = (x < width/2) ? width/2: (x >= width) ? width - 1 : x;

vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;

rubberbanding = true;

glutPostRedisplay();

}

elserubberbanding = false;

break;

case GLUT_RIGHT_BUTTON:

if(state == GLUT_DOWN && ! rubberbanding&& (v = findV ertex(x,y)) != -1) { if(glutGetModifiers() == GLUT_ACTIVE_CTRL) {

for (int i = v; i< n-1; i++){

vert[v][0] = vert[i+1][0];

vert[i][1] = vert[i+1][1];

}

n--;

}else{

vert[v][0] = (x < width/2) ? width/2 : (x >= width) ? width - 1 : x;

vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;

rubberbanding = true;

}

glutPostRedisplay();

}

elserubberbanding = false;

break;

}

}

void motion(int x, int y){

if(rubberbanding){

vert[v][0] = (x < width/2) ? width/2 : (x >= width) ? width - 1 : x;

y = height-1-y;

vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y; glutPostRedisplay();

}

}

void normalize(float * v){

float m = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);

for(int i = 0; i < 3; i++)

v[i] = v[i] / m;

}

floatvv(float * v1, float * v2){

return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];

}

voidvxv(float * n, float * v1, float * v2){

n[0] = v1[1] * v2[2] - v1[2] * v2[1];

n[1] = v1[2] * v2[0] - v1[0] * v2[2];

n[2] = v1[0] * v2[1] - v1[1] * v2[0];

}

voidloadIdentity(Matrix m){

Matrix identity = {{1.0,0.0,0.0,0.0},

{0.0,1.0,0.0,0.0},

{0.0,0.0,1.0,0.0},

{0.0,0.0,0.0,1.0}};

for(int i = 0;i < 4; i++)

for(int j = 0;j < 4; j++)

m[i][j] = identity[i][j];

}

voidpreMultiply(Matrix p, Matrix m){

int i , j;

Matrix t;

for( i = 0; i < 4; i ++)

for( j = 0; j < 4; j++)

t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];

for( i = 0; i < 4; i ++)

for( j = 0; j < 4; j ++)

m[i][j] = t[i][j];

}

void rotate(float angle, float * axis){

float v[3]= {axis[0],axis[1],0},

i[3]={1,0,0},

k[3]= {0,0,1};

loadIdentity(RM);

normalize(v);

float r1= (v[1] < 0) ? acos(vv(v,i)) : -acos(vv(v,i));

Matrix Rz = {{cos(r1), -sin(r1),0.0,0.0},

{sin(r1),cos(r1),0.0,0.0},

{0.0,0.0,1.0,0.0},

{0.0,0.0,0.0,1.0}};

preMultiply(Rz,RM);

float r2 = -acos(vv(axis,k));

Matrix Ry={{cos(r2),0.0,sin(r2),0.0},

{0.0,1.0,0.0,0.0},

{-sin(r2),0.0,cos(r2),0.0},

{0.0,0.0,0.0,1.0}};

preMultiply(Ry,RM);

Matrix R={{cos(angle),-sin(angle),0.0,0.0},

{sin(angle),cos(angle),0.0,0.0},

{0.0,0.0,1.0,0.0},

{0.0,0.0,0.0,1.0}};

preMultiply(R,RM);

Matrix R_y={{cos(-r2),0.0,sin(-r2),0.0},

{0.0,1.0,0.0,0.0},

{-sin(-r2),0.0,cos(-r2),0.0},

{0.0,0.0,0.0,1.0}};

preMultiply(R_y,RM);

Matrix R_z={{cos(-r1),-sin(-r1),0.0,0.0},

{sin(-r1),cos(-r1),0.0,0.0},

{0.0,0.0,1.0,0.0},

{0.0,0.0,0.0,1.0}};

preMultiply(R_z,RM);

preMultiply(RM,CRM);

}

voiddrawQMesh(){

inti,j;

float v1[3],v2[3],norm[3];

glBegin(GL_QUADS);

for(i = 0; i < n-1; i++)

for(j=0;j

v1[0] = QMesh[i+1][j+1][0] - QMesh[i][j][0];

v1[1] = QMesh[i+1][j+1][1] - QMesh[i][j][1];

v1[2] = QMesh[i+1][j+1][2] - QMesh[i][j][2];

v2[0] = QMesh[i+1][j][0] - QMesh[i][j+1][0];

v2[1] = QMesh[i+1][j][1] - QMesh[i][j+1][1];

v2[2] = QMesh[i+1][j][2] - QMesh[i][j+1][2];

vxv(norm,v1,v2);

glNormal3fv(norm);

glV ertex3fv(QMesh[i][j]);

glV ertex3fv(QMesh[i][j+1]);

glV ertex3fv(QMesh[i+1][j+1]);

glV ertex3fv(QMesh[i+1][j]);

}

glEnd();

}

voidmodelDisplay(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

float M[16];

for(int r = 0; r < 4; r++) for(int c = 0; c < 4; c++) M[4 * c + r] = CRM[r][c];

glMultMatrixf(M);

glScalef(zoom,zoom,zoom);

drawQMesh();

glPopMatrix();

glPushMatrix();

glLightfv(GL_LIGHT0,GL_AMBIENT,amb);

glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glPopMatrix();

glutSwapBuffers();

}

voidmodelKeyboard(unsigned char key, int x, int y){ switch (key) {

case 'o':glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-4,4,-4,4,6,14);

glMatrixMode(GL_MODELVIEW);

break;

case 'p':glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(45.0,1.0,6.0,14.0);

glMatrixMode(GL_MODELVIEW);

break;

case 'x':lightPosition[0] = lightPosition[0] - 0.5;

break;

case 'X':lightPosition[0] = lightPosition[0] + 0.5;

break;

case 'y':lightPosition[1] = lightPosition[1] - 0.5;

break;

case 'Y':lightPosition[1] = lightPosition[1] + 0.5;

break;

case 'z':lightPosition[2] = lightPosition[2] - 0.5;

break;

case 'Z':lightPosition[2] = lightPosition[2] + 0.5;

break;

}

glutPostRedisplay();

}

voidmodelMouse(intbutton,intstate,intx,int y){

switch (button){

case GLUT_LEFT_BUTTON:

if(state == GLUT_DOWN ){

cx = x;

cy = h - 1 - y;

dx = dy = 0;

left_button_down = true;

}else

left_button_down = false;

break;

case GLUT_RIGHT_BUTTON:

if(state == GLUT_DOWN){

cx = x;

cy = h - 1 - y;

right_button_down = true;

}else

right_button_down = false;

break;

}

}

voidmodelMotion(int x, int y){

计算机图形学作业

计算机图形学第一次作业 计算机X班XXX 1XXX010XXX 1.你是否想用图形学的有关知识去解决一两个实际问题?你想解决的问题是什么?考虑如何解决? 答:我希望可以解决的有设计汽车外壳和制作动画。 解决方法:(1)汽车外壳 使用3D MAX/AutoCAD软件进行设计。 (2)制作动画 利用动画制作软件(3D MAX)在计算机上制作动画 2.某彩色图形显示系统,CRT显示器的分辨率为1024×1024,它可以从2^17次方种颜色中选择出2^15次方来显示,其帧缓冲器的容量应该如何计算?查色表的长度和宽度应为多少? 解:16b==2B 因为分辨率为1024x1024 所以1024*1024*2B=2MB 3.采用Bresenham画线算法,绘出起点(1,3),终点为(9,18)的直线段。 解: void DrawBresenhamline(int x0, int y0, int x1, int y1) { int dx = x1 - x0;//x偏移量 int dy = y1 - y0;//y偏移量 int ux = dx >0 ?1:-1;//x伸展方向 int uy = dx >0 ?1:-1;//y伸展方向 int dx2 = dx <<1;//x偏移量乘2 int dy2 = dy <<1;//y偏移量乘2 if(abs(dx)>abs(dy)) {//以x为增量方向计算 int e = -dx; //e = -0.5 * 2 * dx,把e 用2 * dx* e替换 int x = x0;//起点x坐标 int y = y0;//起点y坐标 for (x = x0; x < x1;x+=ux) { printf ("%d,%d\n",x, y); e=e + dy2;//来自2*e*dx= 2*e*dx + 2dy (原来是e = e + k) if (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点) { y += uy; e= e - dx2;//2*e*dx = 2*e*dx - 2*dx (原来是e = e -1) } } } else {//以y为增量方向计算

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学作业-Display-答案分析

计算机图形学作业I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学实验报告 (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))

计算机图形学课程设计书

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

计算机图形学作业-Display-答案

计算机图形学作业 I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); 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++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

图形学场景设计

图形学场景设计

计算机图形学课程设计报告 题目自然场景设计 院(系、部) 专业班级 学号

姓名成绩

1 设计目的与要求 1.1设计题目 自然场景设计 1.2 设计目的 以小组合作的方式绘制一个自然场景,给绘制的实体添加纹理光照效果,进一步巩固所学知识,提高团队合作能力 1.3 设计要求 (1)采用真实感图形学技术设计一个自然场景(2)模拟出水、云、山体等至少三种景物(3)实现场景的漫游 (4)对设计出的图像进行光照处理 (5)将图片的纹理贴附到物体表面 2 总体设计 2.1 功能简介 创建一个900*600的Windows窗口,在窗口中显示冰箱、电灯、茶壶三个实体,根据电灯位置在

地面上绘制个实体的投影;为茶壶添加纹理;利用键盘的方向键控制冰箱旋转,实现场景漫游2.2 功能模块图 主 初始化实体绘键盘操 作函数 电灯冰箱 茶壶 2.3 软件各模块功能介绍 2.3.1冰箱和茶壶的绘制 由四边形拼接出冰箱,通过平移旋转函数放置到指定位置,同时实现茶壶的绘制,在茶壶上添加纹理效果,通过平移旋转变换放置到冰箱上面2.3.2顶灯的绘制

绘制出一个带灯罩的电灯,并且将光源放置在灯泡的位置 2.3.3 设置光照 设置光照的各种参数,为场景添加光照效果,让实体具有立体效果 2.3.4 纹理图片生成 用数组存储一幅自己设计的纹理图片,方便实体添加纹理效果时的调用 2.3.5 影子生成 根据需求为场景中的实体添加阴影效果,使得场景效果更加逼真 2.3.6 法向量设置 为场景设置法向量,确保实体在不同的角度都能被看到 3 详细设计及关键代码 3.1 光照模块详细设计 3.1.1 光照设置功能 设置光照的各种参数,为场景添加光照效果,让实体具有立体效果 3.1.2 光照设置设计

计算机图形学作业题

计算机图形学作业题 1. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数(颜色、线型等)来表示图形称图形的参数表示;枚举出图形中所有的点称图形的点阵表示,简称为图像(数字图像) 2. 什么是计算机图形学?计算机图形学有哪些研究内容? 3. 计算机图形学有哪些应用领域? 4. 计算机图形学有哪些相关学科分支?它们的相互关系是怎样的? 5. 图形系统的软件系统由哪些软件组成?举例说明。 6. 了解计算机图形系统的硬件。 7. 什么是显示器的分辨率、纵横比、刷新率? 8. 什么是像素、分辨率、颜色数?分辨率、颜色数与显存的关系? 分辨率M ?N 、颜色个数K 与显存大小V 的关系: 例:分辨率为1024像素/行?768行/ 帧,每像素24位(bit )颜色(224种颜色)的显示器,所需的显存为:1024?768?24位(bit )=1024?768?24/8=2359296字节(byte )。或:每像素16777216种颜色(24位真彩色),1024?768的分辨率,所需显存为:1024?768?log 216777216位显存=2359296字节显存。 9. 什么是图元的生成?分别列举两种直线和圆扫描转换算法。 10. OpenGL 由核心库GL(Graphics Library)和实用函数库GLU(Graphics Library Utilities)两个库组成。 11. 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? 点阵式(bitmap fonts 点阵字——raster 光栅方法):采用逐位映射的方式得到字符的点阵和编码——字模位点阵。 笔画式(outline fonts 笔画字——stroke 方法):将字符笔画分解为线段,以线段端点坐标为字符字模的编码。 13. 图形信息包含图形的 和 。 14. 什么是图形变换?图形变换只改变图形的 不改变图形的 。图形变换包括 和 ( )。 15. 熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的变换矩阵。要求写出求解过程及结果。 18. 试写出针对固定参考点、任意方向的比例变换矩阵。 19. 试写出对任意直线y=mx+b 的对称变换矩阵。 20. 什么是窗口?什么是视区?什么是观察变换? 21. 简述二维观察变换的流程。 22. 试述窗口到视区的变换步骤,并推出变换矩阵。 ??—(位) —K N M V 2log ??≥

计算机图形学课程教学大纲

《计算机图形学》课程教学大纲一、课程基本信息 课程代码:110053 课程名称:计算机图形学 英文名称:Computer Graphics 课程类别:专业课 学时:72 学分: 适用对象:信息与计算科学专业本科生 考核方式:考试(平时成绩占总成绩的30%) 先修课程:高级语言程序设计、数据结构、高等代数 二、课程简介 中文简介: 计算机图形学是研究计算机生成、处理和显示图形的学科。它的重要性体现在人们越来越强烈地需要和谐的人机交互环境:图形用户界面已经成为一个软件的重要组成部分,以图形的方式来表示抽象的概念或数据已经成为信息领域的一个重要发展趋势。通过本课程的学习,使学生掌握计算机图形学的基本原理和基本方法,理解图形绘制的基本算法,学会初步图形程序设计。 英文简介: Computer Graphics is the subject which concerned with how computer builds, processes and shows graphics. Its importance has been shown in people’s more and more intensively need for harmony human-machine interface. Graphics user interface has become an important part of software. It is a significant trend to show abstract conception or data in graphics way. Through the learning of this course, students could master Computer Graphics’basic theories and methods,understand graphics basic algorithms and learn how to design basic graphics program. 三、课程性质与教学目的 《计算机图形学》是信息与计算科学专业的一门主要专业课。通过本课程的学习,使学生掌握基本的二、三维的图形的计算机绘制方法,理解光栅图形生成基本算法、几何造型技术、真实感图形生成、图形标准与图形变换等概念和知识。学会图形程序设计的基本方法,为图形算法的设计、图形软件的开发打下基础。 四、教学内容及要求 第一章绪论 (一)目的与要求 1.掌握计算机图形学的基本概念; 2.了解计算机图形学的发展、应用; 3.掌握图形系统的组成。

计算机图形学作业题

1、已知一直线段起点(0,0),终点(8,6),利用Bresenham算法生成此直线段,写出 生成过程中坐标点及决策变量d的变化情况,并在二维坐标系中,标出直线上各点。 2、试用中点画圆算法原理推导第一象限中y=0到x=y半径为R的圆弧段的扫描转换算法。(要求写清原理、误差函数和递推公式,并进行优化) 3、如下图所示多边形,若采用扫描线算法进行填充,试写出该多边形的ET表和当扫描线Y=3时的有效边表(AET表)。 4、试按左下右上顺序用四向算法,分析当S1为种子时,下图区域的填充过程。 5、将下图中的多边形ABCD先关于点C(3,4)整体放大2倍,再绕点D(5,3)顺时针旋转90 ,试推导其变换矩阵、计算变换后的图形各顶点的坐标,并画出变换后的图形。

6、已知三角形ABC 各顶点的坐标A(3,2)、B(5,5)、C(4,5),相对直线P 1P 2(线段的坐标分别为:P 1 (-3,-2) 、P 2 (8,3) )做对称变换后到达A ’、B ’、C ’。 试计算A ’、B ’、C ’的坐标值。(要求用齐次坐标进行变换,列出变换矩阵,列出计算式子,不要求计算结果) 7、试作出下图中三维形体ABCDE 的三视图。要求写清变换过程,并画出生成的三视图。 x 8、试采用Sutherland –Cohen 裁剪算法,叙述裁剪如下图所示的直线AB 和CD 的步骤: ① 写出端点A 、B 、C 、D 的编码; ② 写出裁剪原理和直线AB 、CD 的裁剪过程。 A B C D 9 、用梁友栋算法裁减如下图线段AB ,A 、B 点的坐标分别为(3,3)、(-2,-1) 裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。

《计算机图形学实验报告》

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号: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;

16秋西交《计算机图形学》在线作业

奥鹏17春16秋西交《计算机图形学》在线作业 一、单选(共30 道,共60 分。) 1. 在三维造型中,不可以使用垂直扫掠造型方法构造的有( )。 A. 园柱 B. 长方体 C. 三棱锥 D. 正十二面体 标准解: 2. 在直线段的参数方程表示方法中,参数t的取值范围为( )。 A. 【0,1】 B. 【0,∞】 C. 【-1,1】 D. 【-1,0】 标准解: 3. 如果希望在CorelDRAW中创建的多个页面具有相同的图形元素,可以执行下面的哪一项操作( ) A. 先创建多个页面,然后分别在各个页面中绘制相同的图形元素 B. 创建一个页面并在此页面绘制需要的图形元素,然后再将此页面复制多个 C. 选择“Layout-Page Setup”命令,在弹出的对话框中进行设置 D. 在Master Page中创建一个图层,在此图层中绘制希望出现在各个页面中的图形元素,则此各个页面将具有相同的图形元素 标准解: 4. 下列有关平面几何投影的叙述,错误的是( )。 A. 透视投影又可分为一点透视、二点透视、三点透视 B. 斜投影又可分为等轴测、斜二测 C. 正轴测又可分为等轴测、正二测、正三测 D. 正视图又可分为主视图、侧视图、俯视图 标准解: 5. 要快速以递增的方式增大字体大小,可以利用“文本”工具选择特定的字符后,执行以下哪步操作( ) A. 按CTRL + "+"键 B. 双击“缩放”工具 C. 按CTRL + 数字小键盘上的"8" D. 按CTRL + 数字小键盘上的"2" 标准解: 6. 有M个控制顶点Pi(i=1,…k)所决定的n次B样曲线,由()段n次B样曲线段光滑连接而成。

计算机图形学实验报告,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; }

计算机图形学中英文课程简介

计算机图形学中英文课程简介 实施和推进“双语教学”是我国高等教育适应国际化趋势、培养富有创新精神和国际视野的复合型高素质人才的重要举措。在学院领导和相关部门的关心和支持下,计算机图形学课程被推荐选为双语教学课程。 计算机图形学课程是国际计算机学科领域的一门主干课程,是国际计算机科学与技术专业本科所开设的必修课程之一。计算机图形学是最令人兴奋并且发展最快的计算机领域之一,已经成为人机交互、可视化、游戏、动画、虚拟/增强现实、计算机仿真、CAD、GIS等共性基础问题。开设本门课程的主要目的是让学生掌握计算机图形学基本内容,为将来的工作和进一步深造打下坚实的基础。 充分发挥多媒体教学的作用,初步实现双语教学,突出教学改革目的。让学生了解计算机图形系统的硬件体系结构、软件架构和典型应用。掌握计算机图形学的基本概念、基本原理、基本算法。重点掌握图形在计算机系统内部显示的全过程,包括:扫描转换、几何变换、投影、剪裁、消隐、颜色理论、交互技术、真实感显示。整个教学过程,采用自顶向下的方法,通过对OpenGL图形的编程和初步应用实践活动,逐步引导学生对图形学理论方法和技术的学习和深化。 学生在学习该门课程时,最好已经具备以下基本知识和技能:已经掌握基本 C /C++编程能力、基本数据结构、几何数学知识、简单线性算法。 教材选用美国原版教材,由新墨西哥大学ANGEL教授所著INTERACTIVE COMPUTER GRAPHICS: A TOP-DOWN APPROACH USING OPENGL (5TH EDITION) 。ANGEL教授自从1997年发布该书第一版以来,一直活跃在计算机图形学领域教学科研第一线。2009该书连续发布到了第5版,被国内外众多大学选为教材和参考书。参考书将采用Addison-Wesley 出版社的The OpenGL Programmer’s Guide (the Redbook中文称为红宝书) 和the OpenGL Reference Manual (The Blue book中文称为蓝宝书)。 Introduction to Computer Graphics Computer graphics has been widely used in human-computer interaction, visualization, game, animation, virtual / augmented reality, computer simulation, computer-aided design (CAD), geographic information system(GIS). The course is an introduction course to computer graphics, which give a broad introduction to Computer Graphics, including software, hardware and applications. A top-down approach will be used in the teaching and studying and OpenGL will be selected as basic programming environment. The prerequisites for the course is that the student should have a good knowledge of programming skills in C (or C++), basic data structures, linked lists, arrays, geometry and simple linear algebra. The outline of course the will be summarized as follows. Part 1: Introduction, Chapter 1, Lectures 1-3, What is Computer Graphics? Applications

计算机图形学作业

1?什么是图形?在计算机中,图形是如何表示的?计算机图形学的主要研究内容是什么? 答:从广义上说,能够在人的视觉系统中形成的视觉印象的客观对象都称为图形。在计算机图形学中,图形是对客观对象的一种抽象表示,它带有形状和颜色信息。在计算机中,图形通过用点陈法和参数法来表示图形。计算机图形学的主要研究内容是图形的输入,图形的处理,图形的生成和输出。 2?试举例说明计算机图形学的应用。 答:图形用户界面,计算机辅助设计,科学计算可视化,科技、教育、商业领域中的交互式绘图,计算机艺术,地理信息系统,计算机动画、广告及娱乐,多媒体系统,虚拟现实系统。 3.试列举出你所知道的图形输入与输出设备。 答:图形输入设备:鼠标,图形输入板,跟踪球,光笔,触摸屏,操纵杆,空间球,数据手套。 图形输出设备:阴极射线管显示器,液晶显示器,等离子显示器,绘图仪。 4.你用过哪些图形软件包?把它们列举出来。 答:OpenGL DirectX。 5.阴极射线管有哪几个部分组成?它们的功能分别是什么? 答:阴极射线管有五部分组成:电子枪,聚焦系统,加速电极,偏转系统,荧光屏。 电子枪的功能:电流通过灯丝产生热量,对阴极加热使其发出电子束,控制电子束的强弱和数量。 聚焦系统的功能:聚焦系统通过电场或磁场控制电子束,使电子束“变细”,保证轰击荧光屏时产生的亮点足够小,提高显示系统的分辨率。 加速电极的功能:加速电极加有正的高电压,使经过聚焦的电子束高速运动。 偏转系统的功能:控制电子束的水平方向上和竖直方向上的偏转。 荧光屏的功能:显示图形。 6.什么叫刷新?刷新频率与荧光物质的持续发光时间的关系如何? 答:在画线显示器中,电子束在荧光屏上产生的亮点只能持续极短的时间,为了产生静态的不闪烁的图形,电子束必须周期性地反复扫描所要绘制的图形,这种扫描

计算机图形学总结

1、图形学简介 1.1、解释计算机图形学中图形与图像两个概念的区别。 答:图形是指由外部轮廓线条构成的矢量图。即由计算机绘制的直线、圆、矩形、曲线、图表等;而图像是由扫描仪、摄像机等输入设备捕捉实际的画面产生的数字图像,是由像素点阵构成的位图。(百度知道) ·从广义上说,凡是能够在人的视觉系统中形成视觉印象的客观对象都称为图形。它包括人年说观察到的自然界的景物,用照相机等设别所获得的图片,用绘图工具绘制的工程图,各种人工美术绘画和用数学方法描述的图形等。 ·图形学中的图形一般是指由点、线、面、体等几何要素(geometric attribute)和明暗、灰度(亮度)、色彩等视觉要素(visual attribute)构成的,从现实世界中抽象出来的图或形。图形强调所表达对象的点、线、面、结构等几何要素。 ·而图像则只是指一个二维的像素集合,至于这个集合所构成的图案的意义、几何元素等,计算机并不知晓。可以一条直线作比方来说明。 1.2、解释“计算机图形学” 研究的主要内容。 答:是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。(百度百科) ·Modeling建模 构建三维模型的场景 ·Rendering 绘制(渲染) 渲染的三维模型,计算每个像素的颜色。颜色是有关照明,环境,对象材料等。 ·Animation动画 1.3、能列举计算机图形学的一些应用实例。 答:CAD工业制造仿真、电影特效合成、3D动画、3D游戏…… 2、Graphic Devices in Computer System 2.1、了解图形输出设备中“阴极射线管(CRT)”的主要工作原理。 答:显示屏、电子枪、和偏转控制装置三部分组成。当灯丝被加热时,电子枪阴极释放出电子,电子经过聚焦系统和加速系统后形成电子束,经过偏转控制装置时轨迹发生变化,打在显示屏磷粉涂层上发光。 ·Storing: 为每个象素设置一个电容维持一定的电压,使象素持续发光。 ·Refresh: 不断重复轰击像素,使其不断重复发光;由于人眼的视觉暂留效应,就会产生象素持续发光的印象。 2.2、解释“随机扫描显示器”与“光栅扫描显示器”的不同。 答:随机扫描显示器显示图形时,电子束的移动方式是随机的,电子束可以在任意方向上自由移动,按照显示命令用画线的方式绘出图形,因此也称矢量显示器。而光栅扫描显示器显示图形时,电子束依照固定的扫描线和规定的扫描顺序进行扫描。电子束先从荧光屏左上角开始,向右扫一条水平线,然后迅速地回扫到左边偏下一点的位置,再扫第二条水平线,照此固定的路径及顺序扫下去,直到最后一条水平线,即完成了整个屏幕的扫描。随机扫描显示器依靠显示文件对屏幕图形进行刷新;光栅扫描显示器则依靠帧缓存实现对屏幕图形的刷新。 ·随机扫描显示器(向量显示器):控制电路比较复杂,不适于显示非常复杂的图像,已基本被淘汰。 ·光栅扫描显示器:似乎很笨,但控制简单,可绘制任意复杂的图像,故远远优于vector display;出现以后迅速成为主流,并大大促进了图形学的发展(因其能够绘制任意复杂的图像)。也有采用隔行扫描的,即先扫描所有偶数行,再扫描所有奇数行。

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