《计算机图形学上机报告(共13页).doc》由会员分享,可在线阅读,更多相关《计算机图形学上机报告(共13页).doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上计算机图形学上机实验报告计算机科学与技术学院班 级: 学 号: 姓 名: 指导教师: 完成日期: 实验一:基本图元绘制一. 实验目的1. 了解如何利用OpenGL库绘制图形2. 理解glut程序框架3. 理解窗口到视区的变换4. 理解OpenGL实现动画的原理二. 实验内容1. 实现中点Bresenham算法画直线2. 实现改进Bresenham算法画直线3. 实现圆的绘制三. 实验结果1.DDA算法画直线2. 中点Bresenham算法画直线3. 改进Bresenham算法画直线4. Bresenham算法画圆四. 源程序#include #include #inc
2、lude stdio.hint m_PointNumber = 0; /动画时绘制点的数目int m_DrawMode = 4; /绘制模式 1 DDA算法画直线 / 2 中点Bresenham算法画直线 / 3 改进Bresenham算法画直线 / 4 八分法绘制圆 / 5 四分法绘制椭圆/绘制坐标线void DrawCordinateLine(void)int i = 0 ;/坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES); for (i=10;i abs(dy) epsl = abs(dx);else epsl = abs(dy);
3、xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k=num-1) printf(x=%f,y=%f,取整后 x=%d,y=%dn, x, y, (int)(x+0.5),(int)(y+0.5);break;x += xIncre;y += yIncre;if(x = 25 | y = 25) break;void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);
4、if(num = 1)printf(中点Bresenham算法画直线:各点坐标及判别式的值n);else if(num=0)return;/画线算法的实现GLsizei dx,dy,d,UpIncre,DownIncre,x,y,xend=0;if(x0x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while (x=num-1) break;x+;if(d= 50 | y = 50) break;void Bresenham2L
5、ine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)printf(改进的Bresenham算法画直线:各点坐标及判别式的值n);else if(num=0)return;/画线算法的实现GLsizei x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while (x=num-1) break;x+;e=e+2*dy;if(e0)y+;e=e-2*dx;if(x = 50 | y = 50) break;
6、void BresenhamCircle(GLsizei x, GLsizei y, GLsizei r, GLsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)printf(Bresenham算法画圆:各点坐标及判别式的值n);x=0,y=r;GLsizeid=1-r;while (x=num) break;putpixel(y,x);if (x=num) break;putpixel(-y,x);if (x=num) break;putpixel(-x,y);if (x=num) break;putpixel(-x,-y);if (x=num)
7、break;putpixel(-y,-x);if (x=num) break;putpixel(y,-x);if (x=num) break;putpixel(x,-y);if(d0)d+=2*x+3;elsed+=2*(x-y)+5;y-;x+;/初始化窗口void Initial(void) / 设置窗口颜色为蓝色 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);/ 窗口大小改变时调用的登记函数void ChangeSize(GLsizei w, GLsizei h)if(h = 0)h = 1;/ 设置视区尺寸 glViewport(0, 0, w, h);/
8、重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围 if (w = h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);/ 在窗口中绘制图形void ReDraw(void)/用当前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);/画出坐标线DrawCordinateLine();switch(m_DrawMode)case
9、1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,20,15,m_PointNumber);break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber);break;case 4:BresenhamCircle(5,5,18,m_PointNumber);break;default:break; glFlush();/设置时间回调函数void TimerFunc(int value)if(m_PointNumber = 0)value = 1;m_PointNu
10、mber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);/设置键盘回调函数void Keyboard(unsigned char key, int x, int y) if (key = 1) m_DrawMode = 1;if (key = 2) m_DrawMode = 2;if (key = 3) m_DrawMode = 3;if (key = 4) m_DrawMode = 4;m_PointNumber = 0;glutPostRedisplay();/void main(void)int ma
11、in(int argc, char* argv)glutInit(&argc, argv);/初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(800,600);glutInitWindowPosition(100,100);glutCreateWindow(基本图元绘制程序); glutDisplayFunc(ReDraw); glutReshapeFunc(ChangeSize); glutKeyboardFunc(Keyboard);/键盘响应回调函数glutTimer
12、Func(500, TimerFunc, 1); / 窗口初始化 Initial();glutMainLoop(); /启动主GLUT事件处理循环return 0;实验二:日地月模型一. 实验目的1. 理解OpenGL中的变换过程2. 理解透视投影与平行投影的不同3. 了解深度测试二. 实验内容1. 通过变换调整观察的位置与方向2. 实现太阳、地球和月亮的运动模型三. 实验结果太阳、地球和月亮的运动模型图1.图2.图3.四. 源程序#include #include #include #include void Initial()glEnable(GL_DEPTH_TEST);/ 启用深度测试
13、glFrontFace(GL_CCW);/ 指定逆时针绕法表示多边形正面glClearColor(1.0f, 1.0f, 1.0f, 1.0f );/背景为白色void ChangeSize(int w, int h)if(h = 0)h = 1;/ 设置视区尺寸 glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 设置修剪空间GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45.0, fAspect, 1.0, 500.0);/* if
14、 (w 360.0f)fElect1 = 10.0f; glutSwapBuffers();void TimerFunc(int value) glutPostRedisplay(); glutTimerFunc(100, TimerFunc, 1);int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutCreateWindow(日地月模型);glutReshapeFunc(ChangeSize);glutDisplayFunc(RenderScene); glutTimerFunc(500, TimerFunc, 1);Initial();glutMainLoop();return 0;专心-专注-专业