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