OpenGl实验3

#include <gl/glut.h>
static GLsizei iMode = 1; 
static GLfloat sx = 1.0;
static GLfloat sy = 1.0;
static GLfloat tx = 0.0f;
static GLfloat ty = 0.0f;
void Initial(void)
{
		glClearColor(1.0f, 1.0f, 1.0f, 1.0f);      //设置窗口背景颜色为白色
		gluOrtho2D(-30.0,30.0,-20.0,20.0);//居中显示
}
void ChangeSize(int w,int h)
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);     //设置投影参数
	glLoadIdentity();
	gluOrtho2D(-30.0,30.0,-20.0,20.0);//居中显示
}
void Display(void)
{
		glClear(GL_COLOR_BUFFER_BIT);   //用当前背景色填充窗口
		glMatrixMode(GL_PROJECTION);     //设置投影参数
		glLoadIdentity();

		glTranslatef(tx, 0.0f, 0.0f);     
		glTranslatef(0.0f, ty, 0.0f); 
		glScalef(sx,sy,0.0f);//左键每一次点击扩大0.1
		glColor3f(1.0f, .0f, 0.0f);            //设置当前的绘图颜色为红色
		switch(iMode)
		{
		case 1:
			glColor3f(.0f, 0.0f, 0.0f); //黑
			break;
		case 2:
			glColor3f(1.0f, .0f, .0f); //红
			break;
		case 3:
			glColor3f(0.0f, .0f, 1.0f); //蓝
			break;
		case 4:
			glColor3f(.0f, 1.0f, 0.0f); //绿
			break;
		case 5:
			glColor3f(1.0f, 1.0f, 1.0f); //白
			break;
		case 6:
			glDisable(GL_LINE_STIPPLE);
			break;
		case 7:
			glEnable(GL_LINE_STIPPLE);
			glLineStipple(1,255);
			break;
		default :
			break;
		}


		//多边形的绘制
		glBegin(GL_LINE_LOOP);
			glVertex2f(-10,-10);
			glVertex2f(10,-10);
			glVertex2f(20,0);
			glVertex2f(0,10);
			glVertex2f(-20,0);
		glEnd();
		
		glFlush();                         //处理所有的OpenGL程序
}

void ProcessMenu(int value)
{
	iMode = value;
	glutPostRedisplay();
}
//键盘交互调用函数
void Key(unsigned char key,int x,int y)
{
	switch(key)
	{
	case 'q':
		exit(0);
		break;
	case 'Q':
		exit(0);
		break;
	case 'S':
		sx+=0.1;
		sy+=0.1;
		glutPostRedisplay();
		break;
	case 'D':
		sx-=0.1;
		sy-=0.1;
		glutPostRedisplay();
		break;
	default:
		break;
	}
}
//如果是鼠标键控制旋转,可以参考p93
void SpecialKeys(int key,int x,int y)
{
	if(key == GLUT_KEY_UP)	ty += 0.1f;
	if(key == GLUT_KEY_DOWN) ty -= 0.1f;
	if(key == GLUT_KEY_LEFT) tx -= 0.1f;
	if(key == GLUT_KEY_RIGHT) tx += 0.1f;
	
	glutPostRedisplay();
}
//鼠标交互调用函数,左键缩小,右键扩大
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
	if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)
	{
		sx+=0.1;
		sy+=0.1;
	}
	if(button ==GLUT_RIGHT_BUTTON && action == GLUT_DOWN)
	{
		sx-=0.1;
		sy-=0.1;
	}
	glutPostRedisplay();
}

int main(int argc, char* argv[])
{
		glutInit(&argc, argv);
		glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //初始化窗口的显示模式
		glutInitWindowSize(800,800);                  //设置窗口的尺寸
		glutInitWindowPosition(600,120);               //设置窗口的位置
		glutCreateWindow("矩形");                    //创建一个名为矩形的窗口

		
		//创建菜单
		int color= glutCreateMenu(ProcessMenu);
		glutAddMenuEntry("黑色",1);
		glutAddMenuEntry("红色",2);
		glutAddMenuEntry("蓝色",3);
		glutAddMenuEntry("绿色",4);
		glutAddMenuEntry("白色",5);
		int lineStrpple = glutCreateMenu(ProcessMenu);
		glutAddMenuEntry("直线",6);
		glutAddMenuEntry("虚线",7);
		int nMainMenu = glutCreateMenu(ProcessMenu);
		glutAddSubMenu("颜色",color);
		glutAddSubMenu("线型",lineStrpple);
		glutAttachMenu(GLUT_MIDDLE_BUTTON);//与鼠标中键绑定


		glutKeyboardFunc(Key);			//普通键输入注册函数
		glutSpecialFunc(SpecialKeys);
		glutMouseFunc(MousePlot);		//注册鼠标响应函数
		//glutMotionFunc(MouseMove);//鼠标按下并移动时的响应函数
		//glutReshapeFunc(ChangeSize);

		glutDisplayFunc(Display);                     //设置当前窗口的显示回调函数
		Initial();                                    //完成窗口初始化
		glutMainLoop();                             //启动主GLUT事件处理循环
		return 0;
}


原文地址:https://www.cnblogs.com/javawebsoa/p/3104908.html