图形学复习.doc_第1页
图形学复习.doc_第2页
图形学复习.doc_第3页
图形学复习.doc_第4页
图形学复习.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

选择题1.我国的第一个计算机图形标准是 没有查到第一个国际图形标准GKS(graphical kernel system)2.平行投影的分类3.计算机显示一般采用的的颜色模型是RGB4.图元扫描转换算法:线画图元的扫描转换算法是计算出落在线段上或充分靠近它的一串像素,并以此像素近似替代连续直线段在屏幕上显示的过程5.贝塞尔曲线的性质:端点性 凸包性 几何不变性 变差缩减性6.图形的变换:平移 旋转 放大缩小(改变的是物体的特点而不是位置) (了解)错切变换:错切变换是一种数学变换,最简单的理解就是以平行四边形的一条边不动,然后拖动另一对边的顶点,这个过程就是切的过程。7.曲线曲面表达式:3种 显式 隐式 参数 。三种形式的优缺点: 非参数的形式的缺点有与坐标轴相关;非平面曲线、曲面,有些复杂的难以用常系数的非参数化函数表示(如螺旋渐开线);不便于计算机编程参数表示的优点点动成线;可以满足几何不变性的要求;可以避免斜率带来的问题; 易于定界;可以节省工作量;参数变化对各因变量的影响明显。8种子填充算法:种子填充算法采用的边界定义是区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可以具有和边界相同的颜色值。程序从(x,y)开始,先检测该点的颜色,如果它与边界色和填充色均不相同,就用填充色填充该点,然后检测相邻位置,以确定它们是否边界色和填充色,若不是,就填充该相邻点。这个过程延续到已经检测完边界范围内的所有像素为止。计算题题目要求是第二象限的推导,下面是第一象限的推导2. 利用中点Bresenham画圆算法的原理推导第一象限从y=0到x=y圆弧段的扫描转换算法(设半径为R,要求写清原理、误差函数、递推公式)。解:算法原理:如图a所示,从y=0到x=y圆弧段即为逆时针方向,此时当y方向走一步时,x方向能否走一步需要根据判别式进行判断,推导如下:先构造函数F(x,y)=x2+y2-R2,对于圆上点F(x,y)0;对于圆外点F(x,y)0;圆内点F(x,y)0。假设M为Pr和Pl的中点即M(xi-0.5,yi+1)所以判别式为:图ad=F(xM,yM)=F(xi-0.5,yi+1)= (xi-0.5)2+( yi+1)2-R2当d0时,如图c,下一点取Pl(xi-1,yi+1)当d0时,任取上述情况中一种即可。误差项的递推:如图b所示,当d0时图b,取Pl(xi-1,yi+1),欲判断下一个象素,应计算:d=F(xi-1.5,yi+2)=d-2xi+2yi+3, 即d的增量为-2xi +2yi+3。绘制第一个点为(R,0),所以d的初始值为d0F(R-0.5,1)=1.25-R3.直线的生成算法DDA:A(3,7) B(12,16)求该直线扫描转换算法1. x=12-3=9 y=16-7=9 因为斜率k=1 max(|x |,| y |)= 所以=1/max(|x |,| y |)=1/9 xi+1=xi+* x yi+1=yi+* y 就这样循环算出多个点的坐标再在坐标系上描出直线简答题1. 图形的扫描转换:确定一个像素集合及其颜色,用于显示一个图形的过程,称为图形的扫描转换或光栅。化,也叫图形的生成。2. 显示列表的含义:OpenGL显示列表(Display List)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就依次执行表中所列出的函数语句显示列表不能装入的函数:glDeleteLists() glIsEnable() glFeedbackBuffer() glIsList() glFinish() glPixelStore() glGenLists() glRenderMode() glGet*() glSelectBuffer()3.齐次坐标系的作用: 书上105页下面论述题 1.bresenham书上47页2.Cohen-Sutherland 算法 书上137页程序题1. 显示列表绘制一个多面体,每个顶点设置一种颜色,并有旋转效果#include #define WIDTH 400#define HEIGHT 400 #include #define ColoredVertex(c, v) do glColor3fv(c); glVertex3fv(v); while(0)GLfloat angle = 0.0f; void myDisplay(void) static int list = 0; if( list = 0 ) / 如果显示列表不存在,则创建GLfloat PointA = -0.5, -5*sqrt(5)/48, sqrt(3)/6,PointB = 0.5, -5*sqrt(5)/48, sqrt(3)/6,PointC = 0, -5*sqrt(5)/48, -sqrt(3)/3,PointD = 0, 11*sqrt(6)/48, 0; GLfloatColorR = 1, 0, 0, ColorG = 0, 1, 0, ColorB = 0, 0, 1,ColorY = 1, 1, 0;list = glGenLists(1); glNewList(list, GL_COMPILE);glBegin(GL_TRIANGLES); / 平面ABC ColoredVertex(ColorR, PointA);ColoredVertex(ColorG, PointB);ColoredVertex(ColorB, PointC); / 平面ACDColoredVertex(ColorR, PointA); ColoredVertex(ColorB, PointC); ColoredVertex(ColorY, PointD);/ 平面CBD ColoredVertex(ColorB, PointC); ColoredVertex(ColorG, PointB); ColoredVertex(ColorY, PointD);/ 平面BAD ColoredVertex(ColorG, PointB); ColoredVertex(ColorR, PointA); ColoredVertex(ColorY, PointD);glEnd(); glEndList();glEnable(GL_DEPTH_TEST);/ 已经创建了显示列表,在每次绘制正四面体时将调用它 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(angle, 1, 0.5, 0); glCallList(list); glPopMatrix(); glutSwapBuffers();void myIdle(void) +angle; if( angle = 360.0f ) angle = 0.0f; myDisplay(); int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowPosition(200, 200); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow(OpenGL 窗口); glutDisplayFunc(&myDisplay); glutIdleFunc(&myIdle);glutMainLoop(); return 0; 2镜面反射#include #include #include static GLint ImageWidth;static GLint ImageHeight;static GLubyte* PixelData;void myDisplay(void);int main(int argc, char * argv)FILE* pFile = fopen(d:/12.bmp, rb);/打开一个用于读取的二进制文件if (pFile = 0)printf(12.bmp文件打开失败!n);exit(0);/读取图象的宽度和高度fseek(pFile, 0x0012, SEEK_SET);fread(&ImageWidth, sizeof(ImageWidth), 1, pFile);fread(&ImageHeight, sizeof(ImageHeight), 1, pFile);/计算像素数据长度GLint LineLength, TotalLength;LineLength = ImageWidth * 3;while (LineLength % 4 != 0)+LineLength;TotalLength = ImageHeight * LineLength;/分配内存PixelData = (GLubyte*)malloc(TotalLength);if (PixelData = 0)printf(内存分配失败!n);exit(0);/读取文件体的像素数据到内存中fseek(pFile, 54, SEEK_SET);fread(PixelData, TotalLength, 1, pFile);fclose(pFile); / 关闭文件glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(500, 300);glutCreateWindow(OpenGL光照演示);glutDisplayFunc(myDisplay);glutMainLoop();return 0;void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glDrawPixels(ImageWidth, ImageHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE, PixelData);/设置各种变换glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 0.0, -10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);/设置0号光源, 它是一种白色的光源GLfloat sun_light_position = 0.0f, 0.5f, 0.0f, 1.0f ;/光源的位置在坐标系的原点处GLfloat sun_light_ambient = 0.0f, 0.0f, 0.0f, 1.0f ;/光源的光线经过散射之后为黑色, 强度为1GLfloat sun_light_diffuse = 1.0f, 1.0f, 1.0f, 1.0f ;/光源的光线经过漫反射之后为白色, 强度为1GLfloat sun_light_specular = 1.0f, 1.0f, 1.0f, 1.0f ;/光源的光线经过镜面反射之后为白色, 强度为1glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);/设置光源所在的位置glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);/设置多次反射后的颜色glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);/设置漫反射后的颜色glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);/设置镜面反射后的颜色glEnable(GL_LIGHT0);/开启第0号光源glEnable(GL_LIGHTING);/打开光照处理功能glEnable(GL_DEPTH_TEST);/启用深度测试/创建有镜面反射的实体GLfloat earth_mat_ambient = 0.0f, 0.5f, 0.0f, 1.0f ;/地球本身散射出去的光为浅红色, 强度为1GLfloat earth_mat_diffuse = 0.0f, 0.5f, 0.0f, 1.0f ;/地球本身漫反射出去的光为浅红色, 强度为1GLfloat earth_mat_specular = 0.0f, 1.0f, 0.0f, 1.0f ;/地球本身通过镜面反射出去的光为红色, 强度为1GLfloat earth_mat_emission = 0.0f, 0.0f, 0.0f, 1.0f ;/地球本身发出的GLfloat earth_mat_shininess = 6.0f;/地球的镜面指数为30glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);/设置正面材质接受到多次反射光之后的颜色glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);/设置正面材料接受到漫反射之后的颜色glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);/设置正面材料接受到镜面反射之后的颜色glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);/设置正面材料本身就向外发出的光线的颜色glMaterialf(GL_FRONT, GL_SHININESS, earth_mat_shininess);/设置正面材料的镜面指数, 越小就越粗糙glTranslatef(5.0f, 0.0f, 0.0f);/向左移动5个单位glutSolidSphere(3.0, 100, 100);/设置地球的大小glBegin(GL_LINES); glColor3f(1.0,1.0,1.0);glVertex3f(-5.0, -10.0, 0.0);/中间线条glVertex3f(-5.0, 10.0, 0.0);glEnd();/创建没有镜面反射的实体GLfloat earth_mat_ambient = 0.0f, 0.0f, 0.0f, 1.0f ;/地球本身散射出去的光为浅红色, 强度为1GLfloat earth_mat_diffuse = 0.0f, 0.0f, 0.0f, 1.0f ;/地球本身漫反射出去的光为浅红色, 强度为1GLfloat earth_mat_specular = 0.0f, 1.0f, 0.0f, 1.0f ;/地球本身通过镜面反射出去的光为红色, 强度为1GLfloat earth_mat_emission = 0.0f, 0.0f, 0.0f, 1.0f ;/地球本身发出的GLfloat earth_mat_shininess = 40.0f;/地球的镜面指数为30glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);/设置正面材质接受到多次反射光之后的颜色glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);/设置正面材料接受到漫反射之后的颜色glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);/设置正面材料接受到镜面反射之后的颜色glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);/设置正面材料本身就向外发出的光线的颜色glMaterialf(GL_FRONT, GL_SHININESS, earth_mat_shininess);/设置正面材料的镜面指数, 越小就越粗糙glTranslatef(-10.0f, 0.0f, 0.0f);/向右移动10个单位glutSolidSphere(3.0, 100, 100);/设置地球的大小glFlush();glutSwapBuffers();3.在正方形中做一个镂空效果(图案任意)#include void myDisplayFunc(void);int main(int argc, char * argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(200, 200);glutInitWindowSize(300, 300);glutCreateWindow(直接设置数组来镂空多边形);glutDisplayFunc(myDisplayFunc);glutMainLoop();return 0;void myDisplayFunc(void)static GLubyte Mask128 = 0x00, 0x00, 0x00, 0x00, /最左下角0x00, 0x00, 0x00, 0x00,0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, 0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, 0x04, 0x18, 0x18, 0x20, 0x04, 0x

温馨提示

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

评论

0/150

提交评论