在OpenGL上用Bresenham算法画圆
时间: 2024-05-01 22:22:38 浏览: 13
Bresenham算法是一种快速绘制圆的算法,它基于对称性和递归思想,可以高效地计算出圆上的所有点。
在OpenGL中,我们可以使用glPointSize函数设置点的大小,然后使用glBegin(GL_POINTS)和glEnd()函数包含绘制的所有点。下面是使用Bresenham算法绘制圆的示例代码:
```c
#include <GL/glut.h> // 包含 glut 库
#include <math.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT); // 清空屏幕
int r = 100; // 圆的半径
int x = 0, y = r; // 圆心为(0, 0)
int d = 3 - 2 * r; // 初始化决策参数
glBegin(GL_POINTS); // 开始绘制点
while (x <= y) {
glVertex2f(x, y); // 绘制圆上的点
glVertex2f(-x, y);
glVertex2f(x, -y);
glVertex2f(-x, -y);
glVertex2f(y, x);
glVertex2f(-y, x);
glVertex2f(y, -x);
glVertex2f(-y, -x);
if (d < 0) {
d += 4 * x + 6;
} else {
d += 4 * (x - y) + 10;
y--;
}
x++;
}
glEnd(); // 结束绘制点
glFlush(); // 刷新屏幕
}
int main(int argc, char **argv) {
glutInit(&argc, argv); // 初始化 GLUT 库
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式
glutInitWindowSize(400, 400); // 设置窗口大小
glutInitWindowPosition(100, 100); // 设置窗口位置
glutCreateWindow("Bresenham Circle Algorithm"); // 创建窗口,窗口名称为 "Bresenham Circle Algorithm"
glClearColor(0.0, 0.0, 0.0, 0.0); // 设置清屏颜色
glMatrixMode(GL_PROJECTION); // 设置投影矩阵
glLoadIdentity(); // 重置矩阵
gluOrtho2D(-200, 200, -200, 200); // 设置坐标系范围
glutDisplayFunc(display); // 注册回调函数
glutMainLoop(); // 进入主循环
return 0;
}
```
在这个示例中,我们使用了glVertex2f函数绘制点,它的参数是点的坐标。由于圆具有对称性,我们只需要计算出1/8个圆的上半部分,然后利用对称性复制即可得到完整的圆。决策参数d的计算采用了递归思想,可以高效地计算出圆上的所有点。