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~~