⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fhwork.cpp

📁 这个是一个opengl程序
💻 CPP
字号:
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//
//fhwork is made by fh and his classmates
//2004.7.8
//

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
//////////////////////////////////////////

#define Width_Normal 1
#define Width_Thicker 2
#define Width_Thickest 3

#define iColor_Red 4
#define iColor_Green 5
#define iColor_White 6
#define iColor_Yellow 7
#define iColor_Blue 8

#define iFillIN_No 9
#define iFillIN_Single 10
#define iFillIN_Transition 11

// Rotation amounts
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

int iWidth = Width_Normal; 
int iColor = iColor_Green;
int iFillIN = iFillIN_No;

GLfloat i=0;

//bezier's points
GLint nNumPoints = 6;

GLfloat ctrlPoints_Right[6][3] = {{  20.0f, 70.0f, 0.0f},	// End Point
								{ 15.0f, 50.0f, 0.0f},	// Control Point
								{  5.0f, 20.0f, 0.0f},	// Control Point
								{ 70.0f, 0.0f, 0.0f},	// Control Point
								{  40.0f, -40.0f, 0.0f},	// Control Point
								{  30.0f, -70.0f, 0.0f }};	// End Point

GLfloat ctrlPoints_Left[6][3] = {{  -20.0f, 70.0f, 0.0f},	// End Point
								{ -15.0f, 50.0f, 0.0f},	// Control Point
								{  -5.0f, 20.0f, 0.0f},	// Control Point
								{ -70.0f, 0.0f, 0.0f},	// Control Point
								{  -40.0f, -40.0f, 0.0f},	// Control Point
								{  -30.0f, -70.0f, 0.0f }};	// End Point

// This function does any needed initialization on the rendering context. 
void ProcessMenu(int value)
{
	switch(value)
	{
	case 1:
		iWidth = Width_Normal;
		break;		
	case 2:
		iWidth = Width_Thicker;//中
		break;		
	case 3:
		iWidth = Width_Thickest;//粗
		break;	
		
	case 4:
		iColor = iColor_Red;
		break;		
	case 5:
		iColor = iColor_Green;
		break;		
	case 6:
		iColor = iColor_White;
		break;
	case 7:
		iColor = iColor_Yellow;
		break;
	case 8:
		iColor = iColor_Blue;
		break;

	case 9:
		iFillIN = iFillIN_No;
		break;
	case 10:
		iFillIN = iFillIN_Single;
		break;
	case 11:
		iFillIN = iFillIN_Transition;
		break;	
		
	default:
		break;
	}
	
	glutPostRedisplay();
}

// Called to draw scene
void RenderScene(void)
{

	// Clear the window
	glClear(GL_COLOR_BUFFER_BIT);	
	
	// Save matrix state and do the rotation
	glPushMatrix();
	glRotatef(xRot, 1.0f, 0.0f, 0.0f);
	glRotatef(yRot, 0.0f, 1.0f, 0.0f);
	
	// Set the line width 线宽
	if(iWidth == Width_Normal)
		glLineWidth(1.0f);
	
	if(iWidth == Width_Thicker)
		glLineWidth(3.0f);
	
	if(iWidth == Width_Thickest)
		glLineWidth(5.0f);

	// Set drawing color 颜色
	if(iColor == iColor_Red) 
		glColor3f(1.0f, 0.0f, 0.0f);
	if(iColor == iColor_Green) 
		glColor3f(0.0f, 1.0f, 0.0f);
	if(iColor == iColor_White) 
		glColor3f(1.0f, 1.0f, 1.0f);
	if(iColor == iColor_Yellow) 
		glColor3f(1.0f, 1.0f, 0.0f);
	if(iColor == iColor_Blue) 
		glColor3f(0.0f, 0.0f, 1.0f);

	//填充
	if(iFillIN == iFillIN_No)
	{
		glShadeModel(GL_FLAT);
		// Draw the line
		glBegin(GL_LINES);
		glVertex2f(-20.0f, 70.0f);
		glVertex2f(20.0f, 70.0f);
		glVertex2f(-30.0f, -70.0f);
		glVertex2f(30.0f, -70.0f);	
		glEnd();
		
		// Sets up the bezier
		// This actually only needs to be called once and could go in
		// the setup function
		glMap1f(GL_MAP1_VERTEX_3,	// Type of data generated
			0.0f,						// Lower u range
			100.0f,						// Upper u range
			3,							// Distance between points in the data
			nNumPoints,					// number of control points
			&ctrlPoints_Right[0][0]);			// array of control points
		
		// Enable the evaluator
		glEnable(GL_MAP1_VERTEX_3);
		
		// Map a grid of 100 points from 0 to 100
		glMapGrid1d(100,0.0,100.0);
		
		// Evaluate the grid, using lines
		glEvalMesh1(GL_LINE,0,100);
		
		glMap1f(GL_MAP1_VERTEX_3, 0.0f, 100.0f, 3, nNumPoints, &ctrlPoints_Left[0][0]);			
		
		// Enable the evaluator
		glEnable(GL_MAP1_VERTEX_3);
		
		// Use higher level functions to map to a grid, then evaluate the
		// entire thing.
		
		// Map a grid of 100 points from 0 to 100
		glMapGrid1d(100,0.0,100.0);
		
		// Evaluate the grid, using lines
		glEvalMesh1(GL_LINE,0,100);
		//bezier end
	}
	if(iFillIN == iFillIN_Single)
	{
		glShadeModel(GL_FLAT);
		glMap1f(GL_MAP1_VERTEX_3,0.0f,100.0f,3,	nNumPoints,	&ctrlPoints_Right[0][0]);
		
		glEnable(GL_MAP1_VERTEX_3);	
		
		glBegin(GL_POLYGON);
		
		glColor3f(0.0,1.0,1.0);
		glVertex3f(0.0f,70.0f,0.0f);
		for( i = 0; i <= 100; i++)
		{			
			glEvalCoord1f((GLfloat) i); 
		}
		glVertex3f(0.0f,-70.0f,0.0f);
		glEnd(); 
		glMap1f(GL_MAP1_VERTEX_3,	
			0.0f,						
			100.0f,						
			3,							
			nNumPoints,				
			&ctrlPoints_Left[0][0]);
		glEnable(GL_MAP1_VERTEX_3);	
		
		glBegin(GL_POLYGON);
		
		glColor3f(0.0,1.0,1.0);
		glVertex3f(0.0f,70.0f,0.0f);
		for( i = 0; i <= 100; i++)
		{			
			glEvalCoord1f((GLfloat) i); 
		}
		glVertex3f(0.0f,-70.0f,0.0f);
		glEnd(); 
	}
	if(iFillIN == iFillIN_Transition)
	{
		glShadeModel(GL_SMOOTH);
		glMap1f(GL_MAP1_VERTEX_3,	
			0.0f,						
			100.0f,						
			3,							
			nNumPoints,				
			&ctrlPoints_Right[0][0]);
		
		glEnable(GL_MAP1_VERTEX_3);	
		
		glBegin(GL_POLYGON);
		glColor3f(0.0,1.0,1.0);
		glVertex3f(0.0f,70.0f,0.0f);
		for( i = 0; i <= 100; i++)
		{			
			glColor3f(i/100,i/150,i/200);
			glEvalCoord1f((GLfloat) i); 
		}
		glColor3f(1.0,1.0,1.0);
		glVertex3f(0.0f,-70.0f,0.0f);
		glEnd(); 
		glMap1f(GL_MAP1_VERTEX_3,	
			0.0f,						
			100.0f,						
			3,							
			nNumPoints,				
			&ctrlPoints_Left[0][0]);
			glEnable(GL_MAP1_VERTEX_3);	
		
		glBegin(GL_POLYGON);

		glColor3f(1.0,0.0,0.5);
		glVertex3f(0.0f,70.0f,0.0f);
		for( i = 0; i <= 100; i++)
		{			
			glColor3f(i/100,i/150,(i+100)/200);
			glEvalCoord1f((GLfloat) i); 
		}
		glColor3f(0.0,0.5,0.5);
		glVertex3f(0.0f,-70.0f,0.0f);
		glEnd(); 
	}

	// Restore transformations
	glPopMatrix();
	
	// Flush drawing commands
	glutSwapBuffers();
}

void SetupRC()
{
	// Black background
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
	
	// Set drawing color 颜色
	glColor3f(0.0f, 1.0f, 0.0f);

	//填充
	glShadeModel(GL_SMOOTH);
	
}

void SpecialKeys(int key, int x, int y)
{
	if(key == GLUT_KEY_UP)
		xRot-= 5.0f;
	
	if(key == GLUT_KEY_DOWN)
		xRot += 5.0f;
	
	if(key == GLUT_KEY_LEFT)
		yRot -= 5.0f;
	
	if(key == GLUT_KEY_RIGHT)
		yRot += 5.0f;
	
	if(key > 356.0f)
		xRot = 0.0f;
	
	if(key < -1.0f)
		xRot = 355.0f;
	
	if(key > 356.0f)
		yRot = 0.0f;
	
	if(key < -1.0f)
		yRot = 355.0f;
	
	// Refresh the Window
	glutPostRedisplay();
}

void ChangeSize(int w, int h)
{
	GLfloat nRange = 100.0f;
	
	// Prevent a divide by zero
	if(h == 0)
		h = 1;
	
	// Set Viewport to window dimensions
    glViewport(0, 0, w, h);
	
	// Reset projection matrix stack
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	
	// Establish clipping volume (left, right, bottom, top, near, far)
    if (w <= h) 
		glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else 
		glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
	
	// Reset Model view matrix stack
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char* argv[])
{
	int nLinesWidthMenu;//线宽
	int nLinesColorMenu;//颜色
	int nLinesFillInMenu;//填充
	int nMainMenu;//主菜单

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutCreateWindow("冯奂(小组)的作业");
	
	// Create the Menu
	//线宽
	nLinesWidthMenu = glutCreateMenu(ProcessMenu);
	glutAddMenuEntry("一般",1);
	glutAddMenuEntry("中",2);
	glutAddMenuEntry("粗",3);

	//颜色
	nLinesColorMenu = glutCreateMenu(ProcessMenu);
	glutAddMenuEntry("红",4);
	glutAddMenuEntry("绿",5);
	glutAddMenuEntry("白",6);
	glutAddMenuEntry("黄",7);
	glutAddMenuEntry("蓝",8);

	//填充
	nLinesFillInMenu = glutCreateMenu(ProcessMenu);
	glutAddMenuEntry("不填充",9);
	glutAddMenuEntry("单色填充",10);
	glutAddMenuEntry("颜色过渡",11);
	
	//主菜单
	nMainMenu = glutCreateMenu(ProcessMenu);
	glutAddSubMenu("线宽", nLinesWidthMenu);
	glutAddSubMenu("颜色", nLinesColorMenu);
	glutAddSubMenu("填充", nLinesFillInMenu);
	glutAttachMenu(GLUT_RIGHT_BUTTON);//右键弹出菜单
	
	glutReshapeFunc(ChangeSize);
	glutSpecialFunc(SpecialKeys);
	glutDisplayFunc(RenderScene);
	SetupRC();
	glutMainLoop();

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -