实验四
二维图形的几何变换
一、实验目的
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);//把菜单与鼠标右键相关联,则点击右键会出现菜单