Bresenham 画圆算法代码详解:带详细注释的实现
#include
void init() { glClearColor(1.0, 1.0, 1.0, 1.0); //设置背景颜色为白色 glMatrixMode(GL_PROJECTION); //设置矩阵模式为投影矩阵 glLoadIdentity(); //将当前矩阵重置为单位矩阵 gluOrtho2D(0, 200, 0, 200); //设置正交投影,左下角为(0,0),右上角为(200,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; //计算初始值p glColor3f(1.0, 0.0, 0.0); //设置绘图颜色为红色 glBegin(GL_POINTS); //开始绘制点 for (x; x <= y; x++) { //从x=R开始循环到x=y glVertex2i(-x + pH.x, y + pH.y); //画8个点 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是否小于等于0
p = p + 4 * x + 6; //更新p的值
}
else {
p = p + 4 * (x - y) + 10; //更新p的值
y--; //减小y的值
}
}
glEnd(); //结束绘制点
glFlush(); //强制刷新缓冲区,保证绘图命令被执行
}
void display() { POINT pH; //定义圆心 pH = { 100,100 }; //圆心坐标为(100,100) int R = 50; //半径为50 int y = R; //初始值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;
原文地址: https://www.cveoy.top/t/topic/n4CB 著作权归作者所有。请勿转载和采集!