opengl实现右键菜单选择鼠标控制将皮筋实现折线矩形

该博客介绍了如何使用OpenGL来实现一个橡皮筋效果的折线矩形,并通过右键菜单进行鼠标控制。作者提供了两端的实现代码,可供读者进一步扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

折线实现,我这边只实现了两端,可以根据我的代码往下扩展,废话不说,上代码

#include<windows.h>
#include<GL/glut.h>
int iPointNum = 0;
int x1=0,x2=0,y1=0,y2=0;                    //点坐标
int x11=0,x22=0,y11=0,y22=0;
int x=0,y=0,xx=0,yy=0;
int winWidth = 400, winHeight = 300;        //窗口高度宽度
int choose=0;                               //菜单选择
int flag=0,flag1=0;
void Initial(void){
    glClearColor(1.0f,1.0f,1.0f,1.0f);      //窗口背景
}
void ChangeSize(int w,int h){
    winWidth = w;  winHeight = h;           //保存当前窗口大小
    glViewport(0,0,w,h);                    //指定窗口显示区域
    glMatrixMode(GL_PROJECTION);            //投影参数
    glLoadIdentity();                       //调用单位矩阵,去掉以前设置的投影参数
    gluOrtho2D(0.0,winWidth,0.0,winHeight); //设置投影参数
}
void DisplayLine(){

}
void Display(void){
    glClear(GL_COLOR_BUFFER_BIT);           //背景填充色
    glColor3f(1.0f,0.0f,0.0f);              //绘图颜色
    if(choose == 2){
        if(iPointNum >= 1){
            glBegin(GL_QUADS);                  //矩形
            glVertex2i(x1,y1);
            glVertex2i(x11,y11);
            glVertex2i(x2,y2);
            glVertex2i(x22,y22);
            glEnd();
        }
    }else if(choose == 1){
        if(iPointNum >= 1){
            if(flag1 == 0){
                glBegin(GL_LINES);                  //直线
                    glVertex2i(x1,y1);
                    glVertex2i(x2,y2);
                glEnd();
            }else{
                glBegin(GL_LINES);                  //直线
                    glVertex2i(xx,yy);
                    glVertex2i(x,y);
                glEnd();
                glBegin(GL_LINES);                  //直线
                    glVertex2i(x1,y1);
                    glVertex2i(x2,y2);
                glEnd();
            }
        }
    }
    glutSwapBuffers();                      //交换缓冲区
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse){
    if(choose == 1){
        if(flag == 0){                          //确定起直线
            if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){//鼠标左键被按下
                if(iPointNum == 0|| iPointNum == 2){
                    iPointNum = 1;
                    x1 = xMouse;
                    y1 = winHeight - yMouse;
                    xx=x1;
                    yy=y1;
                }else{                              //鼠标第二次被按下
                    iPointNum = 2;
                    flag=1;
                    x2 = xMouse;
                    y2 = winHeight - yMouse;
                    x=x2;
                    y=y2;
                    glutPostRedisplay();            //重新指定窗口绘制
                }
            }
        }else{                                      //起始点已经确定,终止点是鼠标按下去的点
             flag1 = 1;
            if(iPointNum == 2){
                iPointNum = 1;
                x1 = x2;
                y1 = y2;
            }else if((button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)&&(iPointNum == 1)){
                iPointNum = 2;
                x2 = xMouse;
                y2 = winHeight - yMouse;
                flag=0;
                glutPostRedisplay();            //重新指定窗口绘制
            }
        }
    }else if(choose == 2){
        if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){
            if(iPointNum == 0|| iPointNum == 2){
                iPointNum = 1;
                x1 = xMouse;
                y1 = winHeight - yMouse;
            }else{
                iPointNum = 2;
                x2 = xMouse;
                y2 = winHeight - yMouse;
                x11 = x1;
                y11 = y2;
                x22 = x2;
                y22 = y1;
                glutPostRedisplay();            //重新指定窗口绘制
            }
        }
    }
    if(button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN){
        iPointNum = 0;
        flag1 = 0;
        flag = 0;
        glutPostRedisplay();
    }
}
void PassiveMouseMove(GLint xMouse,GLint yMouse){
    if((iPointNum == 1)&&(choose == 2)){
        x2 = xMouse;
        y2 = winHeight-yMouse;              //当前鼠标点作为末端点
        x11 = x1;
        y11 = y2;
        x22 = x2;
        y22 = y1;
        glutPostRedisplay();
    }else if((iPointNum == 1)&&(choose == 1)){
        x2 = xMouse;
        y2 = winHeight-yMouse;
        glutPostRedisplay();
    }

}
void ProcessMenu(int value){
    switch(value){
    case 1:
        choose = 1;
        break;
    case 2:
        choose = 2;
        break;
    }
}
int main(int argc,char *argv[]){
    glutInit(&argc,argv);                   // 使用GLUT库首先需要进行初始化,对命令行的参数处理
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);// 设置窗口的显示模式,包括缓存和颜色模型
    glutInitWindowSize(400,300);            // (宽,高)窗口的大小
    glutInitWindowPosition(100,100);        // (距离屏幕左边界,距离屏幕上边界)窗口的位置
    glutCreateWindow("hrr20161008045菜单");
    glutDisplayFunc(Display);               // 要显示的内容放到了Display()函数里面,Dis里面的
    glutReshapeFunc(ChangeSize);            //内容都会被刷新回调
    glutMouseFunc(MousePlot);               //鼠标响应函数
    glutPassiveMotionFunc(PassiveMouseMove);//鼠标移动响应函数
    glutCreateMenu(ProcessMenu);
    glutAddMenuEntry("橡皮筋折线",1);
    glutAddMenuEntry("橡皮筋矩形",2);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    Initial();
    glutMainLoop();                         // 需要调用该函数才能显示在屏幕上
    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值