Opengl重点算法画圆
时间: 2023-10-12 13:16:10 浏览: 172
OpenGL中画圆的算法有很多种,以下是两种常见的算法:
1. 中点画圆算法
中点画圆算法是一种逐步逼近的算法,它从圆心开始,每次画出一个像素点,将圆的边缘逼近到像素点上。具体实现步骤如下:
(1)设圆的半径为r,圆心为(x0, y0)。
(2)从圆的正上方的点(x0, y0 + r)开始,计算第一个像素点的坐标(x, y)。
(3)在(x, y)处画点,然后计算下一个像素点的坐标。
(4)重复步骤(3),直到圆的边缘逼近到像素点上。
算法核心代码如下:
```c++
void drawCircle(int x0, int y0, int r) {
int x = 0, y = r;
int d = 1 - r;
while (x < y) {
if (d < 0) {
d += 2 * x + 3;
} else {
d += 2 * (x - y) + 5;
y--;
}
x++;
drawPixel(x0 + x, y0 + y);
drawPixel(x0 + y, y0 + x);
drawPixel(x0 + y, y0 - x);
drawPixel(x0 + x, y0 - y);
drawPixel(x0 - x, y0 - y);
drawPixel(x0 - y, y0 - x);
drawPixel(x0 - y, y0 + x);
drawPixel(x0 - x, y0 + y);
}
}
```
2. Bresenham画圆算法
Bresenham画圆算法是一种快速画圆的算法,它利用了对称性和递归的思想,在每个象限内只需要计算出一个点,然后通过对称性得到其他的点。具体实现步骤如下:
(1)设圆的半径为r,圆心为(x0, y0)。
(2)从圆的正上方的点(x0, y0 + r)开始,计算第一个像素点的坐标(x, y)。
(3)根据当前点和圆心的位置关系,计算下一个像素点的坐标。
(4)重复步骤(3),直到圆的边缘逼近到像素点上。
算法核心代码如下:
```c++
void drawCircle(int x0, int y0, int r) {
int x = 0, y = r;
int d = 3 - 2 * r;
drawPixel(x0 + x, y0 + y);
drawPixel(x0 + y, y0 + x);
drawPixel(x0 + y, y0 - x);
drawPixel(x0 + x, y0 - y);
drawPixel(x0 - x, y0 - y);
drawPixel(x0 - y, y0 - x);
drawPixel(x0 - y, y0 + x);
drawPixel(x0 - x, y0 + y);
while (x <= y) {
if (d < 0) {
d += 4 * x + 6;
} else {
d += 4 * (x - y) + 10;
y--;
}
x++;
drawPixel(x0 + x, y0 + y);
drawPixel(x0 + y, y0 + x);
drawPixel(x0 + y, y0 - x);
drawPixel(x0 + x, y0 - y);
drawPixel(x0 - x, y0 - y);
drawPixel(x0 - y, y0 - x);
drawPixel(x0 - y, y0 + x);
drawPixel(x0 - x, y0 + y);
}
}
```
阅读全文