#include <GL/glut.h>
#include <math.h>
GLsizei winWidth = 800, winHeight = 600; // 窗口的大小
GLfloat red = 1.0, green = 0.0, blue = 0.0; //颜色
GLenum fillMode = GL_SMOOTH;
bool Line,Circle,Rectanger;
int xstart,ystart,xend,yend;//鼠标的坐标
float r;//圆的半径
int NUM=200;// 定义绘制圆时用的顶点数(用顶点组成的线段逼近圆)(new)
void fillOption(GLint s){
//glutPostRedisplay();
}
void graphics(GLint selectedOption)
{
switch (selectedOption) {
case 1:Line=true,Circle=false,Rectanger=false; break;
case 2:Line=false,Circle=true,Rectanger=false; break;
case 3:Line=false,Circle=false,Rectanger=true; break;
}
// glutPostRedisplay ( );
}
void colorselection(GLint selectedOption)
{
switch (selectedOption) {
case 1:red = 1.0, green = 0.0, blue = 0.0; break;
case 2:red = 0.0, green = 1.0, blue = 0.0; break;
case 3:red = 0.0, green = 0.0, blue = 1.0; break;
}
// glutPostRedisplay ( );
}
void mousemove(int xmove,int ymove)
{
if(Line){
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(GL_XOR);
glBegin(GL_LINES);
glVertex2i(xstart,ystart);
glVertex2i(xend,yend);
glEnd();
xend=xmove;
yend=winHeight-ymove;
glBegin(GL_LINES);
glVertex2i(xstart,ystart);
glVertex2i(xend,yend);
glEnd();
glFlush();
}
else if(Rectanger){
glEnable(GL_COLOR_LOGIC_OP);//启动逻辑异或
glLogicOp(GL_XOR);
glBegin(GL_LINE_LOOP);
glVertex2i(xstart,ystart);
glVertex2i(xstart,yend);
glVertex2i(xend,yend);
glVertex2i(xend,ystart);
//glVertex2i(xstart,ystart);
glEnd();
xend=xmove;
yend=winHeight-ymove;
glBegin(GL_LINE_LOOP);
glVertex2i(xstart,ystart);
glVertex2i(xstart,yend);
glVertex2i(xend,yend);
glVertex2i(xend,ystart);
// glVertex2i(xstart,ystart);
glEnd();
glFlush();
}
else if(Circle){
glEnable(GL_COLOR_LOGIC_OP);//启动逻辑异或
glLogicOp(GL_XOR);
r=sqrt((xstart-xend)*(xstart-xend)+(ystart-yend)*(ystart-yend)*1.0)/2; //计算圆的半径
glBegin(GL_LINE_LOOP); // 绘制圆(new)
for(int i=0; i<NUM; i++)
{
glVertex2f((xstart+xend)/2+r*float(sin(2*3.14*i/NUM)),(ystart+yend)/2+ r*float(cos(2*3.14*i/NUM)));
}
glEnd(); // 圆绘制结束
xend=xmove;
yend=winHeight-ymove;
r=sqrt((xstart-xend)*(xstart-xend)+(ystart-yend)*(ystart-yend)*1.0)/2; //计算圆的半径
glBegin(GL_LINE_LOOP); // 绘制圆(new)
for(int i=0; i<NUM; i++)
{
glVertex2f((xstart+xend)/2+r*float(sin(2*3.14*i/NUM)),(ystart+yend)/2+ r*float(cos(2*3.14*i/NUM)));
}
glEnd(); // 圆绘制结束
glFlush();
}
}
void mouseud (int btn,int state,int x,int y)
{
if(Line){
if (btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
xstart = x;
ystart = winHeight - y;
xend=xstart;
yend=ystart;
}
else if(btn==GLUT_LEFT_BUTTON && state == GLUT_UP)
{
xend =x;
yend =winHeight-y;
glDisable(GL_COLOR_LOGIC_OP);
glBegin(GL_LINES);
glVertex2i(xstart,ystart);
glVertex2i(xend,yend);
glEnd();
//Line=false;
glFlush();
}
}
else if(Rectanger){
if (btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
xstart = x;//初始一个点
ystart = winHeight - y;
xend=xstart;
yend=ystart;
}
else if(btn==GLUT_LEFT_BUTTON && state == GLUT_UP)
{
xend =x;
yend =winHeight-y;
glDisable(GL_COLOR_LOGIC_OP);//之前的全是异或操作
glBegin(GL_LINE_LOOP);
glVertex2i(xstart,ystart);
glVertex2i(xstart,yend);
glVertex2i(xend,yend);
glVertex2i(xend,ystart);
//glVertex2i(xstart,ystart);
glEnd();
//Rectanger=false;
glFlush();
}
}
else if(Circle){
if (btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
xstart = x;//初始一个点
ystart = winHeight - y;
xend=xstart;
yend=ystart;
}
else if(btn==GLUT_LEFT_BUTTON && state == GLUT_UP)
{
xend =x;
yend =winHeight-y;
glDisable(GL_COLOR_LOGIC_OP);//之前的全是异或操作
r=sqrt((xstart-xend)*(xstart-xend)+(ystart-yend)*(ystart-yend)*1.0)/2; //计算圆的半径
glBegin(GL_LINE_LOOP); // 绘制圆(new)
for(int i=0; i<NUM; i++)
{
glVertex2f((xstart+xend)/2+r*float(sin(2*3.14*i/NUM)),(ystart+yend)/2+ r*float(cos(2*3.14*i/NUM)));
}
glEnd(); // 圆绘制结束
//Rectanger=false;
glFlush();
}
}
}
void init (void)
{
glClearColor (0.0, 0.0,0.0,0.0); //设置窗口颜色为白色
// glMatrixMode (GL_PROJECTION);
// gluOrtho2D (0.0, 300.0, 0.0, 300.0);
}
void displayTriangle(void)
{
// glShadeModel (fillMode); // Set fill method for triangle.
glColor3f (1.0,0.0,0.0); // Set color for first two vertices.
glFlush ( );
}
void reshapeFcn (GLint newWidth, GLint newHeight)
{
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
glViewport (0, 0, newWidth, newHeight); // 设置视口大小为增个窗口大小
gluOrtho2D (0.0, (GLfloat) newWidth, 0.0, (GLfloat )newHeight);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear (GL_COLOR_BUFFER_BIT);
//glFlush ( );
}
void main (int argc, char **argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (200, 200);
glutInitWindowSize (winWidth, winHeight);
glutCreateWindow ("interGraphics"); // Create pop-up menu.该函数为所创建菜单返回一个独一无二的标识符。
init ( );
glutDisplayFunc (displayTriangle);
//添加菜单***********************************************************************
GLint SubMenu1=glutCreateMenu(graphics); //先创建绘图子菜单
glutAddMenuEntry("line",1); //添加到子菜单
glutAddMenuEntry("circle",2);
glutAddMenuEntry("rectanger",3);
GLint SubMenu2=glutCreateMenu(colorselection); //创建颜色选择子菜单
glutAddMenuEntry("red",1); //添加到子菜单
glutAddMenuEntry("blue",2);
glutAddMenuEntry("green",3);
glutCreateMenu (fillOption); // 创建主菜单.该函数为所创建菜单返回一个独一无二的标识符。
glutAddSubMenu ("graphics",SubMenu1); //添加一个名称为submenu1的子菜单项
glutAddSubMenu("colorselection",SubMenu2); //添加一个名称为submenu2的子菜单项
glutAttachMenu (GLUT_RIGHT_BUTTON); //把菜单附加给一个鼠标右键
glutMotionFunc(mousemove);
glutMouseFunc(mouseud);
glutReshapeFunc (reshapeFcn);
glutMainLoop ( );
}