计算机图形学期末必考要点_第1页
计算机图形学期末必考要点_第2页
计算机图形学期末必考要点_第3页
计算机图形学期末必考要点_第4页
计算机图形学期末必考要点_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章 计算机图形系统【1】(1)电子枪发射电子束,经过聚焦在偏转系统控制下电子束轰击荧光屏,在荧光屏上产生足够小的光点,光点称为像素(pixel)。(2)阴极射线管在水平和垂直方向单位长度上能识别的最大光点数称为分辨率,分辨率越高,显示的画面越清晰。【2】(1)CRT聚焦系统通过电场或磁场控制电子束,使电子束“变细”,保证轰击荧光屏时产生的亮点足够小。为了提高显示系统的分辨率,聚焦系统是关键之一(2)CRT:加速电极加有正的高电压(达几万伏),使经过聚焦的电子束高速运动(3)CRT:偏转系统(由垂直偏转板和水平偏转板组成)偏转控制可以来用静电场,也可以采用磁场,控制电子束在水平方向上和竖直方

2、向上的偏转。最大偏转角度是衡量偏转系统性能的最重要指标(4)持续发光时间指的是电子束离开某点后,该点亮度值衰减到初始值的110所需的时间。【3】真彩色系统:三个电子枪分别是三个通道,产生三色荧光点,具有24位面的帧缓冲存储器,红、绿、蓝各8个位面,其值经数模转换控制红、绿、蓝电子枪的强度,每支电子枪的强度有256(8位)个等级,则能显示256*256*256=16兆种颜色,16兆种颜色也称作(24位)真彩色。这种方法利用人们眼睛在超过一定距离后分辨力不高的特性,产生与直接混色法相同的效果【4】glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /单缓存,

3、RGB窗口 /*以glutInit的例行初始化函数 *其中glutInitDisplayMode()定义显示方式 *参数是一个GLUT库里预定义的可能的布尔组合 * 指定颜色模式的预定义常量有: * 1:GLUT_RGBA或者GLUT_RGB指定一个RGBA窗口,这是一个默认的颜色模式。 * 2:GLUT_INDEX指定颜色索引模式。 * 选择缓冲区 * 1:GLUT_SINGLE单缓冲区窗口 * 2:GLUT_BUFFER双缓冲区窗口,这是产生流畅动画必须选的。 * 特殊的缓冲 * 1:GLUT_ACCUM累积缓冲区 * 2:GLUT_STENCIL模板缓冲区* 3:GLUT_DEPTH深度

4、缓冲区。*/【5】/*glClear()函数的作用是用当前缓冲区清除值,也就是glClearColor *或者glClearDepth、glClearIndex、glClearStencil、glClearAccum等函数所指定的值来清除指定的缓冲区比如: * glClearColor(0.0,0.0,0.0,0.0); * glClear(GL_COLOR_BUFFER_BIT); *第一条语句表示清除颜色设为黑色,第二条语句表示实际完成了把整个窗口清除为黑色的任务 *glClear()的唯一参数表示需要被清除的缓冲区: * GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲 *

5、GL_DEPTH_BUFFER_BIT: 深度缓冲 * GL_ACCUM_BUFFER_BIT: 累积缓冲 * GL_STENCIL_BUFFER_BIT: 模板缓冲 *也可以使用glDrawBuffer一次清除多个颜色缓存*glClear (GL_COLOR_BUFFER_BIT); glTranslatef(0.0f,-20.0f,-40.0f) 表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40 glScaled(10.0f,10.0f,10.0f) 表示将当前图形沿x,y,z轴分别放大为原来的10倍 glRotatef(-80.0f,10.0f,1.0f,0.0f) 表示将

6、当前图形沿方向向量(-10,1,0)顺时针旋转80度 glLoadIdentity() 将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作【6】如果以顺时针绘制则是反面,逆时针绘制则是正面在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。 首先,使用glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之) 然后,使用glCullFace来进行剔

7、除。 glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。 注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。【7】在OpenGL中实现双缓冲技术的一种简单方法:1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);。这里将我们惯用的GLUT_SINGLE

8、替换为GLUT_DOUBLE,意为要使用双缓冲而非单缓冲。2. 调用glutDisplayFunc(display)注册回调函数时,在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。3. 调用glutIdleFunc( )注册一个空闲时绘制操作函数,注册的这个函数再调用display函数。【8】画圆的代码:(1)普通const int n = 1000;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;void DrawCircle() int i; glBegin(GL_LINE_LOOP);

9、 for(i=0; i<n; +i) glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i); glEnd(); glFlush();void myDisplay() glClear(GL_COLOR_BUFFER_BIT); DrawCircle();(2)中点画圆法void CirclePoints(int x,int y,int cx,int cy) /(cx,cy)为圆心坐标 PlotPixel(x+cx, y+cy); PlotPixel(y+cx, x+cy); PlotPixel(-x+cx, y+cy); PlotPixel(y+cx, -

10、x+cy); PlotPixel(x+cx,-y+cy); PlotPixel(-y+cx, x+cy); PlotPixel(-x+cx, -y+cy); PlotPixel(-y+cx, -x+cy);void DrawCircle(int cx, int cy, int radius) int e; int x,y; x=0; y=radius; e=5-4*radius; CirclePoints(x,y,cx,cy); while(x<=y) if(e<0) e+=8*x+12; else e+=8*(x-y)+20; y-; x+; CirclePoints(x,y,c

11、x,cy); 【9】DDA算法实现(满足所有斜率)void myDDALine (int x1, int y1, int x2, int y2)int xa = x1; / make copies of the end-points that you can modifyint ya = y1;int xb = x2;int yb = y2;int i;float dx,dy,length,x,y;if(abs(xb-xa)>=abs(yb-ya)length = abs(xb-xa);elselength=abs(yb-ya);dx=(xb-xa)/length;dy=(yb-ya)/

12、length;i=1;x=xa;y=ya;while(i<=length)PlotPixel(int(x+0.5), int(y+0.5); /glVertex2f(int(x + 0.5),int(y + 0.5);x=x+dx;y=y+dy;i+;【10】Bresenham算法(满足所有斜率)void myBresLine (int x1, int y1, int x2, int y2)int xa = x1;int ya = y1;int xb = x2;int yb = y2;int ystep;int k_diff =abs(y2-y1)-abs(x2-x1);if(k_dif

13、f>0) xa = y1; ya = x1;xb = y2; yb = x2;if(xa>xb)int tempx=xa;xa=xb;xb=tempx;int tempy=ya;ya=yb;yb=tempy;int dx = xb - xa, dy = abs(yb-ya);int p = 2 * dy - dx;int x, y; if(ya < yb)ystep = 1;elseystep = -1;x=xa;y=ya;while(x<xb)if(k_diff>0)PlotPixel(y,x);elsePlotPixel(x,y); if(p>=0)y+

14、=ystep;p += 2 * (dy - dx);else p += 2 * dy;x+;编程题【1】(1)draw()改写为:void sweep:draw()int findex;if(texture) texture->Use();glBegin(GL_QUADS);for(findex=0;findex<face_count;findex+)glNormal3fv(face_listfindex.normal); /定义法向量/定义几何顶点坐标glVertex3fv(vertex_listface_listfindex.index0.xyz);glVertex3fv(ve

15、rtex_listface_listfindex.index1.xyz);glVertex3fv(vertex_listface_listfindex.index2.xyz);glVertex3fv(vertex_listface_listfindex.index3.xyz);glEnd();glFlush();if(texture) glDisable(GL_TEXTURE_2D);(2)在图形类(cube,pyramid)中加入#include "GLTexture.h“private:GLTexture *texture;public:void SetTexture(GLTex

16、ture*text);(3)在main.cpp加入代码GLTexture *text=NULL;cube user_c;(4)在void init()加入代码text=new GLTexture("data/NO1.bmp");if(text)user_c.SetTexture(text);(5)在void render()加入代码user_c.draw();(6)释放纹理对象glutMainLoop();/释放对象if(text) delete text;【2】原型为 glTexCoord2f(GLfloat s, GLfloat t);s和t 代表坐标 s为 X轴坐标,

17、t为Y轴坐标,用于绘制图形时指定纹理的坐标。第一个参数是X坐标,0.0是纹理的左侧,0.5是纹理的中点,1.0是纹理的右侧。第二个参数是Y坐标,0.0是纹理的底部,0.5是纹理的中点,1.0是纹理的顶部。为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。【3】cube.CPP#include "cube.h"#include "prefix.h"cube:cube(

18、void)texture=NULL;vertex_count=8;face_count=6;vertex_list=new VERTEX8;face_list=new FACE6;vertex_list0.xyz0=-1;/上左前点vertex_list0.xyz1=1;vertex_list0.xyz2=1;vertex_list1.xyz0=-1;/上左后点vertex_list1.xyz1=1;vertex_list1.xyz2=-1;vertex_list2.xyz0=1;/上右后点vertex_list2.xyz1=1;vertex_list2.xyz2=-1;vertex_list

19、3.xyz0=1;/上右前点vertex_list3.xyz1=1;vertex_list3.xyz2=1;vertex_list4.xyz0=-1;/下左前点vertex_list4.xyz1=-1;vertex_list4.xyz2=1;vertex_list5.xyz0=-1;/下左后点vertex_list5.xyz1=-1;vertex_list5.xyz2=-1;vertex_list6.xyz0=1;/下右后点vertex_list6.xyz1=-1;vertex_list6.xyz2=-1;vertex_list7.xyz0=1;/下右前点vertex_list7.xyz1=-

20、1;vertex_list7.xyz2=1;face_list0.bTriangle=false;face_list0.index0=0;/上面face_list0.index1=3;face_list0.index2=2;face_list0.index3=1;face_list1.bTriangle=false;face_list1.index0=4;/下面face_list1.index1=5;face_list1.index2=6;face_list1.index3=7;face_list2.bTriangle=false;face_list2.index0=0;/前面face_lis

21、t2.index1=4;face_list2.index2=7;face_list2.index3=3;face_list3.bTriangle=false;face_list3.index0=1;/后面face_list3.index1=2;face_list3.index2=6;face_list3.index3=5;face_list4.bTriangle=false;face_list4.index0=0;/左面face_list4.index1=1;face_list4.index2=5;face_list4.index3=4;face_list5.bTriangle=false;f

22、ace_list5.index0=2;/右面face_list5.index1=3;face_list5.index2=7;face_list5.index3=6;/计算每个面上的法向量calculateNormals();void cube:SetTexture(GLTexture*text)texture=text;void cube:draw()if(texture) texture->Use();glBegin(GL_QUADS);/定义上平面的法向量、纹理坐标并绘制平面glNormal3fv(face_list0.normal);glTexCoord2f(0.0,0.0); /

23、定义纹理坐标,左下glVertex3fv(vertex_listface_list0.index0.xyz);glTexCoord2f(1.0,0.0);/定义纹理坐标,右下glVertex3fv(vertex_listface_list0.index1.xyz);glTexCoord2f(1.0,1.0);/定义纹理坐标,右上glVertex3fv(vertex_listface_list0.index2.xyz);glTexCoord2f(0.0,1.0);/定义纹理坐标,左下glVertex3fv(vertex_listface_list0.index3.xyz);/下glNormal3

24、fv(face_list1.normal);glTexCoord2f(0.0,0.0);glVertex3fv(vertex_listface_list1.index0.xyz);glTexCoord2f(1.0,0.0);glVertex3fv(vertex_listface_list1.index1.xyz);glTexCoord2f(1.0,1.0);glVertex3fv(vertex_listface_list1.index2.xyz);glTexCoord2f(0.0,1.0);glVertex3fv(vertex_listface_list1.index3.xyz);/前glNo

25、rmal3fv(face_list2.normal);glTexCoord2f(0.0,0.0);glVertex3fv(vertex_listface_list2.index0.xyz);glTexCoord2f(1.0,0.0);glVertex3fv(vertex_listface_list2.index1.xyz);glTexCoord2f(1.0,1.0);glVertex3fv(vertex_listface_list2.index2.xyz);glTexCoord2f(0.0,1.0);glVertex3fv(vertex_listface_list2.index3.xyz);

26、/后glNormal3fv(face_list3.normal);glTexCoord2f(0.0,0.0);glVertex3fv(vertex_listface_list3.index0.xyz);glTexCoord2f(1.0,0.0);glVertex3fv(vertex_listface_list3.index1.xyz);glTexCoord2f(1.0,1.0);glVertex3fv(vertex_listface_list3.index2.xyz);glTexCoord2f(0.0,1.0);glVertex3fv(vertex_listface_list3.index3.

27、xyz); /左glNormal3fv(face_list4.normal);glTexCoord2f(0.0,0.0);glVertex3fv(vertex_listface_list4.index0.xyz);glTexCoord2f(1.0,0.0);glVertex3fv(vertex_listface_list4.index1.xyz);glTexCoord2f(1.0,1.0);glVertex3fv(vertex_listface_list4.index2.xyz);glTexCoord2f(0.0,1.0);glVertex3fv(vertex_listface_list4.i

28、ndex3.xyz);/右glNormal3fv(face_list5.normal);glTexCoord2f(0.0,0.0);glVertex3fv(vertex_listface_list5.index0.xyz);glTexCoord2f(1.0,0.0);glVertex3fv(vertex_listface_list5.index1.xyz);glTexCoord2f(1.0,1.0);glVertex3fv(vertex_listface_list5.index2.xyz);glTexCoord2f(0.0,1.0);glVertex3fv(vertex_listface_li

29、st5.index3.xyz);glEnd();glFlush();if(texture) glDisable(GL_TEXTURE_2D);cube:cube(void)if(vertex_list!=NULL) delete vertex_list;if(face_list!=NULL) delete face_list;void cube:calculateNormal(float*out, float*a, float*b, float*c)float v13, v23;/ calculate two vectors from the three points v10 = a 0- b

30、0;v11 = a 1- b1;v12 = a 2- b2;v20 = b 0- c0;v21 = b 1- c1;v22 = b 2- c2;/ take the cross product out0 = v11*v22 - v12*v21; out1 = v12*v20 - v10*v22; out2 = v10*v21 - v11*v20; / normalize result float length=sqrt(out0*out0+out1*out1+out2*out2);out0 /= length; out1 /= length; out2 /= length; void cube:calculateNormals()/ first, calculate the normal for each face for (int i=0; i<face_count; i+)calculateNormal( face_listi.normal,/ <- receiververtex_l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论