• 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;
    }
    


  • 相关阅读:
    Makefile常用函数
    Source Insight 中的 Auto Indenting
    Git中的core.autocrlf选项
    [转] VMware中的Ubuntu无法通过桥接方式上网
    Git基础
    数据结构35:二叉树前序遍历、中序遍历和后序遍历
    数据结构34:二叉树前序遍历、中序遍历和后序遍历
    数据结构33:二叉树顺序存储和链式存储
    数据结构32:树存储结构
    数据结构31:树(Tree)详解
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3104908.html
Copyright © 2020-2023  润新知