Bresenham 画圆算法原理详解及 C++ 代码实现
Bresenham 画圆算法原理详解及 C++ 代码实现
Bresenham 画圆算法是一种快速画圆的方法,它基于 Bresenham 画线算法。其原理是通过判断圆弧上各点与圆心的距离与半径的关系,从而确定每个点的位置。在算法中,通过计算一个参数 'p' 的值来判断下一个要绘制的点的位置,'p' 的值由之前绘制的点的位置、半径和圆心位置决定。如果 'p' 小于等于 0,则下一个点在圆弧上方,否则在圆弧下方。同时,当 'p' 大于 0 时,需要将绘制点的 y 坐标减一,以继续绘制圆弧。绘制过程中,通过对称性可以得到其他对应的点的位置,从而绘制整个圆。
C++ 代码实现
#include <iostream>
#include<gl/glut.h>
#include<cmath>
using namespace std;
void init() {
glClearColor(1.0, 1.0, 1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 200, 0, 200);
}
typedef struct point {
int x;
int y;
} POINT;
void BresenHam_Circle(POINT pH,int x,int y,int R) {
int p;
p = 3 - 2 * R;
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
for (x; x <= y; x++) {
glVertex2i(-x + pH.x, y + pH.y);
glVertex2i(-x + pH.x, -y + pH.y);
glVertex2i(x + pH.x, -y + pH.y);
glVertex2i(x + pH.x, y + pH.y);
glVertex2i(-y + pH.y, x + pH.x);
glVertex2i(-y + pH.y, -x + pH.x);
glVertex2i(y + pH.y, -x + pH.x);
glVertex2i(y + pH.y, x + pH.x);
if (p <= 0) {
p = p + 4 * x + 6;
}
else {
p = p + 4 * (x - y) + 10;
y--;
}
}
glEnd();
glFlush();
}
void display() {
POINT pH; //定义圆心
pH = { 100,100 };
int R = 50;
int y = R;
BresenHam_Circle(pH, 0, R, R);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); //绘图初始化
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//单缓存 RGB色
glutInitWindowPosition(100, 100);//设置初始窗口位置
glutInitWindowSize(400, 400);//设置窗口大小
glutCreateWindow("Lines");//设置窗口名称
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
代码解释
-
头文件包含:
iostream: 用于标准输入输出gl/glut.h: 用于 OpenGL 图形库cmath: 用于数学函数
-
结构体定义:
point结构体用于存储圆心的坐标
-
BresenHam_Circle函数:pH: 圆心坐标x: 初始 x 坐标 (从 0 开始)y: 初始 y 坐标 (等于圆的半径)R: 圆的半径- 函数首先计算一个参数 'p' 的值,并用循环遍历 x 坐标,通过判断 'p' 的值来决定下一个绘制点的坐标。
- 函数利用对称性来绘制整个圆。
-
display函数:- 定义圆心坐标和半径
- 调用
BresenHam_Circle函数绘制圆形
-
main函数:- 初始化 GLUT 库
- 设置窗口大小和位置
- 创建窗口
- 注册
display函数为显示回调函数 - 进入 GLUT 主循环
总结
本文介绍了 Bresenham 画圆算法的原理,并提供了 C++ 代码示例。Bresenham 画圆算法是一种简单且高效的算法,它可以用来快速绘制圆形。
原文地址: https://www.cveoy.top/t/topic/n4DX 著作权归作者所有。请勿转载和采集!