OpenGL之鼠标事件两点画线 4

1.使用工具

Code::Blocks

2.鼠标事件的声明
glutMouseFunc(mouseDown);           // 鼠标回调
3.画点与画线

// 绘制点
void drawPoint(int x,int y)
{
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
    glFlush();
}

线

void drawLine(int x1, int y1, int x2, int y2)
{
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_LINES);
    glVertex2i(x1, y1);
    glVertex2i(x2, y2);
    glEnd();
    glFlush();
}
4.鼠标事件函数是固定的4个参数
// 提前声明的点,用于存放上一点
// 定义点结构体
struct Point
{
    int x;
    int y;
};

// 定义一个起始点
Point startPoint = {0, 0};

// 定义一个标志,因为第一次点点是无法连线的
bool isFirst = true;

// ......

// 处理鼠标
void mouseDown(int button,int state,int x,int y)
{
    if (state == GLUT_DOWN)
    {
        if (button == GLUT_LEFT_BUTTON)
        {
            // y的转换
            y = HEIGHT - y;
            drawPoint(x, y);
            // 如果是第一次,不画线,并赋值false关闭
            if (isFirst)
            {
                isFirst = false;
            }
            else
            {
                drawLine(startPoint.x, startPoint.y, x, y);
            }
            // 存储该点
            startPoint.x = x;
            startPoint.y = y;
        }
    }
}
5.实现效果

在这里插入图片描述

6.完整代码
#include <windows.h>
#include <GL/glut.h>

#define WIDTH 400
#define HEIGHT 400

// 声明显示函数方法
void display(void);
// 声明处理鼠标方法
void mouseDown(int key, int state, int x, int y);
// 声明绘制点方法以及画线
void drawPoint(int x, int y);
void drawLine(int x1, int y1, int x2, int y2);

// 定义点结构体
struct Point
{
    int x;
    int y;
};

// 定义一个起始点
Point startPoint = {0, 0};

// 定义一个标志,因为第一次点点是无法连线的
bool isFirst = true;

// 主函数
int main(int argc, char** argv)
{
    glutInit(&argc, argv);              // 初始化
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);      // 设置显示模式
    glutInitWindowSize(WIDTH,HEIGHT);   // 设置窗口大小
    glutInitWindowPosition(400, 100);   // 设置窗口位于屏幕位置
    glutCreateWindow("KUOKUO");         // 创建窗口

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);  // 设置渲染状态
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0, 400, 0, 400);            // 矩阵变换

    glutDisplayFunc(display);           // 显示回调
    glutMouseFunc(mouseDown);           // 鼠标回调

    glutMainLoop();

    return EXIT_SUCCESS;
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
}

// 处理鼠标
void mouseDown(int button,int state,int x,int y)
{
    if (state == GLUT_DOWN)
    {
        if (button == GLUT_LEFT_BUTTON)
        {
            // y的转换
            y = HEIGHT - y;
            drawPoint(x, y);
            // 如果是第一次,不画线,并赋值false关闭
            if (isFirst)
            {
                isFirst = false;
            }
            else
            {
                drawLine(startPoint.x, startPoint.y, x, y);
            }
            // 存储该点
            startPoint.x = x;
            startPoint.y = y;
        }
    }
}

// 绘制点
void drawPoint(int x,int y)
{
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
    glFlush();
}

void drawLine(int x1, int y1, int x2, int y2)
{
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_LINES);
    glVertex2i(x1, y1);
    glVertex2i(x2, y2);
    glEnd();
    glFlush();
}

O(∩_∩)O~~

猜你喜欢

转载自blog.csdn.net/kuokuo666/article/details/88980648
今日推荐