Bresenham 画圆算法详解及代码示例
该代码使用 Bresenham 算法绘制圆形。Bresenham 算法是一种经典的直线和圆形绘制算法,其基本思想是利用差值判断每一步的下一个像素是上下还是左右,并通过计算出来的误差值来确定下一步的位置。具体来说,该算法分为以下几个步骤:
-
定义圆心和半径:在该代码中,首先定义了一个结构体'point' 来表示圆心,并定义了一个整数'R' 来表示圆的半径。
-
初始化变量:在该代码中,定义了变量'p' 和 'y','p' 用来表示误差值,'y' 用来表示当前绘制到的 y 坐标。
-
绘制圆形:在该代码中,通过一个'for' 循环来绘制圆形,循环变量'x' 从 0 到'R',每次循环绘制 8 个对称点,分别是'(-x+圆心x,y+圆心y)','(-x+圆心x,-y+圆心y)','(x+圆心x,-y+圆心y)','(x+圆心x,y+圆心y)','(-y+圆心y,x+圆心x)','(-y+圆心y,-x+圆心x)','(y+圆心y,-x+圆心x)','(y+圆心y,x+圆心x)'。同时,每次循环根据误差值 'p' 来判断下一步绘制的位置,如果 'p<=0',则误差值 'p' 加上 '4x+6';否则,误差值 'p' 加上 '4(x-y)+10',并将 'y' 减 1。
-
绘制:在该代码中,使用 OpenGL 的'glBegin' 和 'glEnd' 函数来绘制点,并使用 'glFlush' 函数刷新缓冲区,使图形输出到屏幕上。
总的来说,该代码的原理是通过 Bresenham 算法来计算圆形上每个像素的位置,然后将其绘制出来,从而实现圆形的绘制。
#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;
}
原文地址: http://www.cveoy.top/t/topic/n4D2 著作权归作者所有。请勿转载和采集!