logo资料库

二维图形的几何变换。.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
实验四 二维图形的几何变换 一、实验目的 1、掌握二维图形的几何变换。 二、实验要求 1、利用二维图形的平移、缩放、旋转等几何变换,完成下面的图形,通过菜单 完成: 1. 二维平移 2. 二维缩放 3. 二维旋转 2、利用二维图形的平移、缩放、旋转等几何变换,任意画出一个二维综合图形。 要求:上面的两题,任选一题完成。 三、实验代码 #include #include #include void Init() glClearColor(1.0f, 1.0f, 1.0f, 0.5f); //设置背景颜色 { } void Reshape(int w, int h) { } glViewport(0, 0, w, h); //设置屏幕尺寸 glMatrixMode(GL_PROJECTION); //指定当前操作投影矩阵堆栈 glLoadIdentity(); //重置投影矩阵 //gluOrtho2D(0, (double)w, 0, (double)h); //设置二维图大小 glOrtho(-w / 2, w / 2, -h / 2, h / 2, -100, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
//画图 void myshape() { int x[5] = { 180,120,140,220,240 }; int y[5] = { 180,140,60,60,140 }; glBegin(GL_LINES); for (int i = 0;i < 5;i++) { } glVertex2i(x[i], y[i]); if (i + 2 > 4) int j = (i + 2) % 5; glVertex2i(x[j], y[j]); { } else glVertex2i(x[i + 2], y[i + 2]); glEnd(); glFlush(); } /*子菜单 1*/ void SubMenuFunc1(int value) { int i, j, k; int x, y; switch (value) { case 1: glLineWidth(4); glColor3f(1.0, 0.0, 1.0); for (i = 1;i <= 4;i++) { if (i == 1) x = 50, y = 50; if (i == 2) x = -50, y = 50; if (i == 3) x = -50, y = -50; if (i == 4) x = 50, y = -50; for (j = 1;j <= 2;j++) { glLoadIdentity(); if (j == 1) {
glColor3f(1.0, 0.0, 1.0); } else { glColor3f(1.0, 1.0, 1.0); } for (k = 1;k <= 8;k++) { myshape(); Sleep(100); glTranslatef(x, y, 0); //glRotatef(45, 0.0, 0.0, 1.0); } } } glutPostRedisplay(); break; case 2: glLineWidth(4); glColor3f(1.0, 0.0, 1.0); for (i = 1;i <= 4;i++) { if (i == 1) x = 50, y = 50; if (i == 2) x = -50, y = 50; if (i == 3) x = -50, y = -50; if (i == 4) x = 50, y = -50; for (j = 1;j <= 2;j++) { glLoadIdentity(); if (j == 1) { glColor3f(1.0, 0.0, 1.0); } else { glColor3f(1.0, 1.0, 1.0); } for (k = 1;k <= 8;k++) { myshape(); Sleep(100); glTranslatef(x, y, 0); glRotatef(45, 0.0, 0.0, 1.0); } } }
glutPostRedisplay(); break; case 3: glLineWidth(4); glColor3f(1.0, 0.0, 1.0); for (i = 1;i <= 3;i++) { myshape(); glScalef(1.1, 1.1, 1.0); myshape(); Sleep(1000); } glutPostRedisplay(); break; } } //当前菜单 void GetCurrentMenu(void) int id1; // id 为添加到该菜单的项的 id 号 glutCreateMenu(SubMenuFunc1); //创建主菜单,并使用回调函数 SubMenuFunc1 glutAddMenuEntry("Translate", 1);//加入菜单项 glutAddMenuEntry("Rotate", 2); glutAddMenuEntry("Scale", 3); glutAttachMenu(GLUT_RIGHT_BUTTON);//把菜单与鼠标右键相关联,则点击右键会出现菜单 { } void myDisplay() { glClear(GL_COLOR_BUFFER_BIT); myshape();
} int main(int argc, char* argv[]) { } glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(500, -500); glutInitWindowSize(1000, 1000); glutCreateWindow("FirstDemo"); Init(); GetCurrentMenu(); glutDisplayFunc(myDisplay); glutReshapeFunc(Reshape); glutMainLoop(); return 0; 四、实验结果截图
五、实验体会 通过此次试验,知道了可以用 for 循环让图形一直旋转,平移或缩放。还了解了 菜单的创建,有以下函数: glutCreateMenu(SubMenuFunc1); //创建主菜单,并使用回调函数 SubMenuFunc1 glutAddMenuEntry("Translate", 1);//加入菜单项 glutAttachMenu(GLUT_RIGHT_BUTTON);//把菜单与鼠标右键相关联,则点击右键会出现菜单
分享到:
收藏