www.pudn.com > glGraph.rar > main.cpp


#include "gl/glut.h" 
#include "glPolygon.h" 
#include "Histogram.h" 
#include "Caky.h" 
#include "stdio.h" 
 
struct GraphList 
{//图形链表 
	glGraph* m_graph;//图形 
	GraphList* m_next;//下一节点 
}; 
 
 
GraphList* head = 0;//表头 
int num = 0; 
GraphList* tail = 0;//表尾 
int m_type = 2;	//当前图形类型 
int m_scale = 1;	//当前图形线宽 
float curColor[3] = {0,0,0}; 
double m_width = 500; 
double m_height = 500; 
 
int submeun1,submeun2,submeun3; 
 
void init() 
{//初始化窗口 
	glClearColor(1.0,1.0,1.0,0.0); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluOrtho2D(250,-250,-250,250); 
} 
 
 
void Display() 
{ 
	glClear(GL_COLOR_BUFFER_BIT); 
 
	GraphList* p = head; 
	while(p) 
	{ 
		p->m_graph->Draw(); 
		p = p->m_next; 
	} 
 
	glFlush(); 
	glutSwapBuffers(); 
} 
 
void Reshape(int width, int height) 
{ 
	m_width = width; 
	m_height = height; 
 
	glViewport(0, 0, width, height); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluOrtho2D(-width/2, width/2, -height/2, height/2); 
	::glMatrixMode(GL_MODELVIEW); 
	::glLoadIdentity(); 
} 
 
int isDown = 0;//标志 
 
void Mouse(int button, int state,int x, int y) 
{ 
	GraphList* p = new GraphList;//创建一节点 
	p->m_graph = 0; 
 
	if(m_type == 2) 
	{ 
		if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
		{ 
			if(isDown == 0) 
			{ 
				glPolygon* polygon = new glPolygon; 
				polygon->AddPoint(x,y,m_width,m_height); 
				polygon->SetColor(curColor); 
				polygon->SetScale(m_scale); 
				isDown = 2;//1被直线用了,多边形用2 
				p->m_graph = polygon; 
				p->m_next = 0; 
				if(head == 0)//加入链表 
					tail = head = p; 
				else 
				{ 
					tail->m_next = p; 
					tail = p; 
				} 
				num++; 
			} 
			else 
			{ 
				((glPolygon*)tail->m_graph)->AddPoint(x,y,m_width,m_height); 
				glutPostRedisplay();    
			} 
		} 
		if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) 
		{ 
			isDown = 0; 
		} 
	} 
	if(m_type == 3)//柱状图 
	{ 
		if(isDown != 0) 
			isDown = 0; 
		if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
		{ 
			CHistogram* h = new CHistogram; 
			h->SetColor(curColor); 
			h->SetOrigin(x,y,m_width,m_height); 
			h->SetHeight(); 
			p->m_graph = h; 
			p->m_next = 0; 
			if(head == 0)//加入链表 
				tail = head = p; 
			else 
			{ 
				tail->m_next = p; 
				tail = p; 
			} 
			num++; 
			glutPostRedisplay();    
		} 
	} 
	if(m_type == 4)//饼图 
	{ 
		if(isDown != 0) 
			isDown = 0; 
		if(button == GLUT_LEFT_BUTTON && state == GLUT_UP) 
		{ 
			CCaky* c = new CCaky; 
			c->SetColor(curColor); 
			c->SetOrigin(x,y,m_width,m_height); 
			c->SetLoca(); 
			p->m_graph = c; 
			p->m_next = 0; 
			if(head == 0)//加入链表 
				tail = head = p; 
			else 
			{ 
				tail->m_next = p; 
				tail = p; 
			} 
			num++; 
			glutPostRedisplay();    
		} 
	} 
 
 
	if(p->m_graph == 0) 
		delete p;//如果没有用到,释放空间 
 
} 
 
void Motion(int x,int y) 
{ 
	if(m_type == 2) 
	{ 
		((glPolygon*)tail->m_graph)->DeleteLastPoint(); 
		((glPolygon*)tail->m_graph)->AddPoint(x,y,m_width,m_height); 
			glutPostRedisplay();    
	} 
} 
 
void CreateMenu(int value) 
{ 
	switch(value) 
	{ 
	case 0://停止 
		isDown = 0; 
		m_type = -1; 
		break; 
	case 1://柱状图 
		m_type = 3; 
		break; 
	case 2://饼图 
		m_type = 4; 
		break; 
	case 3://多边形 
		m_type = 2; 
		break; 
	case 4://清屏 
		GraphList* p; 
		while(head) 
		{ 
			p = head; 
			head = head->m_next; 
			delete p; 
		} 
		glutPostRedisplay();    
		break; 
	} 
} 
 
void CreateSubMenu1(int value) 
{ 
	switch(value) 
	{ 
	case 1: 
		curColor[0] = 1; 
		curColor[1] = 0; 
		curColor[2] = 0; 
		break; 
	case 2: 
		curColor[0] = 0; 
		curColor[1] = 1; 
		curColor[2] = 0; 
		break; 
	case 3: 
		curColor[0] = 0; 
		curColor[1] = 0; 
		curColor[2] = 1; 
		break; 
	} 
} 
 
int isIn = 0; 
int curC = -1;//0为红,1为绿,2为兰 
void Keyboard(unsigned char key, int x, int y) 
{ 
	if((key == 'r' || key == 'R') && isIn == 0) 
	{//设置红颜色 
		curC = 0; 
	} 
	if((key == 'g' || key == 'G') && isIn == 0) 
	{//设置绿颜色 
		curC = 1; 
	} 
	if((key == 'b' || key == 'B') && isIn == 0) 
	{//设置兰颜色 
		curC = 2; 
	} 
	if(isIn == 0) 
	{ 
		isIn++;//当isIn = 0时就置1 
		return; 
	} 
	if(isIn != 0) 
	{//isIn 不等于 0 时开始赋值 
		if(key <= '9' && key >= '0') 
		{ 
			if(isIn == 1)//置第一个数,直接赋值 
				curColor[curC] = key-48; 
			else//第二个后,乘以10再加上当前值 
				curColor[curC] = curColor[curC]*10+(key-48); 
			isIn++; 
		} 
		if(isIn == 4 || !(key <= '9' && key >= '0')) 
		{//当输入不是数字或大于三位数时,输入退出 
			if(isIn != 1)//确定有有效数据更新 
				curColor[curC] /= 255.0; 
			isIn = 0;//恢复标志 
			curC = -1; 
		} 
	} 
} 
 
int main(int argc,char* argv[]) 
{ 
//创建窗口及初始化操作 
	glutInitDisplayMode(GLUT_DOUBLE); 
	glutInitWindowSize(500,500); 
	glutInitWindowPosition(200,100); 
	glutCreateWindow("Ex3"); 
	init(); 
 
	glutMouseFunc(Mouse); //响应鼠标 
//右键建立菜单 
	submeun1 = glutCreateMenu(&CreateSubMenu1); 
	glutAddMenuEntry("红",1); 
	glutAddMenuEntry("绿",2); 
	glutAddMenuEntry("蓝",3); 
 
	glutCreateMenu(&CreateMenu); 
	glutAddMenuEntry("多边形",3); 
	glutAddMenuEntry("柱状图",1); 
	glutAddMenuEntry("饼图",2); 
	glutAddMenuEntry("停止",0); 
	glutAddMenuEntry("清屏",4); 
 
	glutAddSubMenu("颜色",submeun1); 
 
	glutAttachMenu(GLUT_RIGHT_BUTTON); 
 
	glutKeyboardFunc(Keyboard); //响应键盘 
	glutReshapeFunc(Reshape); //当窗口改变时响应 
	glutMotionFunc(Motion); 
	glutDisplayFunc(Display); //显示 
	glutMainLoop(); 
	 
	return 0; 
}