在 OpenGL 中实现画点、画折线、画圆、画矩形、画三角形、画多边线。利用状态模式实 现不同交互方式的控制
时间: 2023-05-29 18:06:35 浏览: 195
画点:
```c++
glBegin(GL_POINTS); // 告诉 OpenGL 接下来要画点
glVertex2f(x, y); // 画一个点,坐标为 (x, y)
glEnd(); // 结束画点过程
```
画折线:
```c++
glBegin(GL_LINE_STRIP); // 告诉 OpenGL 接下来要画一条折线
glVertex2f(x1, y1); // 第一个点的坐标
glVertex2f(x2, y2); // 第二个点的坐标
glVertex2f(x3, y3); // 第三个点的坐标
// ...
glEnd(); // 结束画折线过程
```
画圆:
```c++
glBegin(GL_POLYGON); // 告诉 OpenGL 接下来要画一个多边形
for (int i = 0; i < 360; i++) { // 画 360 条线段组成的圆
float angle = i * 3.1415926 / 180.0; // 将角度转换为弧度
float x = r * cos(angle) + cx; // 计算圆上点的 x 坐标
float y = r * sin(angle) + cy; // 计算圆上点的 y 坐标
glVertex2f(x, y); // 将圆上的点加入多边形的点集中
}
glEnd(); // 结束画圆过程
```
画矩形:
```c++
glBegin(GL_POLYGON); // 告诉 OpenGL 接下来要画一个多边形
glVertex2f(x1, y1); // 左下角的点
glVertex2f(x1, y2); // 左上角的点
glVertex2f(x2, y2); // 右上角的点
glVertex2f(x2, y1); // 右下角的点
glEnd(); // 结束画矩形过程
```
画三角形:
```c++
glBegin(GL_TRIANGLES); // 告诉 OpenGL 接下来要画三角形
glVertex2f(x1, y1); // 第一个点的坐标
glVertex2f(x2, y2); // 第二个点的坐标
glVertex2f(x3, y3); // 第三个点的坐标
glEnd(); // 结束画三角形过程
```
画多边形:
```c++
glBegin(GL_POLYGON); // 告诉 OpenGL 接下来要画一个多边形
glVertex2f(x1, y1); // 第一个点的坐标
glVertex2f(x2, y2); // 第二个点的坐标
glVertex2f(x3, y3); // 第三个点的坐标
// ...
glEnd(); // 结束画多边形过程
```
利用状态模式实现不同交互方式的控制:
```c++
class InteractionState {
public:
virtual void onMouseClick(int x, int y) = 0;
virtual void onMouseMove(int x, int y) = 0;
};
class SelectState : public InteractionState {
public:
void onMouseClick(int x, int y) {
// 处理选择操作
}
void onMouseMove(int x, int y) {
// 处理鼠标移动操作
}
};
class DrawState : public InteractionState {
public:
void onMouseClick(int x, int y) {
// 处理绘制操作
}
void onMouseMove(int x, int y) {
// 处理鼠标移动操作
}
};
class InteractionController {
private:
InteractionState* state;
public:
void setState(InteractionState* newState) {
state = newState;
}
void onMouseClick(int x, int y) {
state->onMouseClick(x, y);
}
void onMouseMove(int x, int y) {
state->onMouseMove(x, y);
}
};
```
使用时,可以根据用户的操作设置不同的状态:
```c++
InteractionController controller;
controller.setState(new SelectState()); // 设置选择状态
controller.onMouseClick(x, y); // 处理鼠标点击事件
controller.onMouseMove(x, y); // 处理鼠标移动事件
controller.setState(new DrawState()); // 设置绘制状态
controller.onMouseClick(x, y); // 处理鼠标点击事件
controller.onMouseMove(x, y); // 处理鼠标移动事件
```