使用opengl语言实现鼠标左键取点并储存,并在点击右键时将点一一相连。
时间: 2023-06-25 14:08:33 浏览: 44
以下是一个简单的 OpenGL 程序,它可以实现鼠标左键取点并储存,右键点击时将点一一相连的功能。你可以在此基础上进行修改和扩展。
```c++
#include <GL/glut.h>
#include <vector>
using namespace std;
int width = 800, height = 600; // 窗口大小
vector<pair<int, int>> points; // 存储点的坐标
void init() {
glClearColor(1.0, 1.0, 1.0, 0.0); // 设置窗口背景颜色为白色
glMatrixMode(GL_PROJECTION); // 设置投影矩阵
gluOrtho2D(0, width, 0, height); // 设置正交投影
}
void display() {
glClear(GL_COLOR_BUFFER_BIT); // 清空窗口
glColor3f(0.0, 0.0, 0.0); // 设置颜色为黑色
glPointSize(5.0); // 设置点的大小为 5 像素
glBegin(GL_POINTS); // 开始绘制点
for (auto p : points) {
glVertex2i(p.first, p.second); // 绘制点
}
glEnd(); // 结束绘制点
if (points.size() > 1) {
glBegin(GL_LINE_STRIP); // 开始绘制线段
for (auto p : points) {
glVertex2i(p.first, p.second); // 绘制线段
}
glEnd(); // 结束绘制线段
}
glFlush(); // 刷新缓冲区
}
void mouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { // 如果左键被按下
points.push_back(make_pair(x, height - y)); // 存储点的坐标
glutPostRedisplay(); // 重绘窗口
}
else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) { // 如果右键被按下
glutPostRedisplay(); // 重绘窗口
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化 GLUT
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式
glutInitWindowSize(width, height); // 设置窗口大小
glutCreateWindow("OpenGL Demo"); // 创建窗口并设置标题
init(); // 初始化 OpenGL
glutDisplayFunc(display); // 注册回调函数 display
glutMouseFunc(mouse); // 注册回调函数 mouse
glutMainLoop(); // 进入主循环
return 0;
}
```
在这个程序中,我们使用了一个 `vector` 来存储点的坐标。当左键被按下时,我们将当前鼠标位置所对应的坐标存储到 `vector` 中,并调用 `glutPostRedisplay()` 函数来重绘窗口。当右键被按下时,我们也调用 `glutPostRedisplay()` 函数来重绘窗口,并在 `display()` 函数中绘制出所有存储的点和线段。
注意,我们存储的坐标需要经过一些变换,使其适应 OpenGL 的坐标系。具体来说,OpenGL 中的坐标系原点在窗口左下角,x 轴正方向向右,y 轴正方向向上,而鼠标事件中的坐标系原点在窗口左上角,x 轴正方向向右,y 轴正方向向下。因此,我们需要将 y 坐标取反,并将其转换到 OpenGL 的坐标系中。