该代码使用 Bresenham 算法绘制圆形。Bresenham 算法是一种经典的直线和圆形绘制算法,其基本思想是利用差值判断每一步的下一个像素是上下还是左右,并通过计算出来的误差值来确定下一步的位置。具体来说,该算法分为以下几个步骤:

  1. 定义圆心和半径:在该代码中,首先定义了一个结构体'point' 来表示圆心,并定义了一个整数'R' 来表示圆的半径。

  2. 初始化变量:在该代码中,定义了变量'p' 和 'y','p' 用来表示误差值,'y' 用来表示当前绘制到的 y 坐标。

  3. 绘制圆形:在该代码中,通过一个'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。

  4. 绘制:在该代码中,使用 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;
}
Bresenham 画圆算法详解及代码示例

原文地址: http://www.cveoy.top/t/topic/n4D2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录