📌  相关文章
📜  在C++中使用openGL在同一控制台上使用极坐标和中点圆绘制算法绘制圆(1)

📅  最后修改于: 2023-12-03 15:37:34.722000             🧑  作者: Mango

在C++中使用openGL在同一控制台上使用极坐标和中点圆绘制算法绘制圆

简介

本项目介绍如何在C++中使用openGL绘制圆形,涉及到中点圆绘制算法和极坐标绘制法。

实现步骤
环境搭建

为了使用openGL库,我们需要在本地安装openGL库和glut库。如果您没有安装的话,请参考以下步骤进行安装:

  1. Windows 在Windows系统中,我们可以使用MinGW作为C++编译器,并通过CMake和Visual Studio Code构建和运行项目。

首先安装MinGW,我们可以从以下网址下载MinGW安装程序: https://sourceforge.net/projects/mingw/files/latest/download

安装并配置后,我们需要安装CMake和Visual Studio Code。CMake是一个开源的跨平台构建工具。我们可以从以下网址下载CMake安装程序:https://cmake.org/download/

Visual Studio Code是一个轻量级的代码编辑器。我们可以从以下网址下载Visual Studio Code安装程序:https://code.visualstudio.com/download

安装完成后,我们需要安装C/C++和CMake插件,以方便使用。

  1. Linux 在Linux系统中,openGL库和glut库通常已经被安装。

在Ubuntu和Debian系统中,可以通过以下命令安装openGL和glut库:

sudo apt-get update
sudo apt-get install freeglut3-dev
sudo apt-get install libglew-dev
sudo apt-get install mesa-common-dev

在Fedora系统中,可以通过以下命令安装openGL和glut库:

sudo dnf install freeglut-devel
sudo dnf install libGLEW-devel
sudo dnf install mesa-libGLU-devel
编写代码

中点圆绘制算法

中点圆绘制算法是一种快速绘制圆的算法,在本项目中我们将使用该算法绘制圆形。

算法原理如下:

  1. 选定圆心和半径
  2. 将圆心作为起始点
  3. 计算出起始点周围点的八个对称点,并初始化算法参数
  4. 循环遍历八个象限
    • 计算出下一个点的坐标
    • 画点
    • 更新参数
    • 判断是否需要更新参数
  5. 循环完所有八个象限后结束

下面是中点圆绘制算法的C++代码:

void drawMidpointCircle(int xc, int yc, int r) {
    float d = 5.0 / 4 - r;
    int x = 0, y = r;

    // 八个象限依次计算
    plot(xc, yc, x, y);
    while (x <= y) {
        if (d < 0) {
            d = d + 2 * x + 3;
            x = x + 1;
        } else {
            d = d + 2 * (x - y) + 5;
            x = x + 1;
            y = y - 1;
        }
        plot(xc, yc, x, y);
    }
}

其中,plot函数可以根据具体开发环境进行实现。在openGL中,我们可以使用glVertex2f函数画出点。

极坐标绘制法

极坐标绘制法是另一种绘制圆形的算法。该算法通过极坐标系中的极角θ和半径r确定圆上一点的坐标(x, y)。算法原理如下:

  1. 选定圆心和半径
  2. 以360度为单位,循环绘制圆上的点
  3. 计算出点的坐标
  4. 画点
  5. 循环完所有角度后结束

下面是极坐标绘制法的C++代码:

void drawPolarCircle(int xc, int yc, int r) {
    glBegin(GL_POINTS);
    for (float theta = 0; theta < 360; theta += 0.1) {
        float x = r * cos(theta * PI / 180);
        float y = r * sin(theta * PI / 180);
        glVertex2f(x + xc, y + yc);
    }
    glEnd();
}

其中,glBegin(GL_POINTS)和glEnd()用于绘制单个点。我们需要在循环内部多次调用glVertex2f函数以绘制多个点,从而组成一个圆形。

绘制圆形

现在我们可以通过以上代码绘制出圆形。我们需要在openGL中设置窗口大小和坐标系范围,并根据需要调用drawMidpointCircle或者drawPolarCircle函数来绘制圆形。

下面是完整的openGL代码片段:

#include <GL/glut.h>
#include <math.h>

const float PI = 3.1415926;

// 中点圆绘制算法
void drawMidpointCircle(int xc, int yc, int r) {
    float d = 5.0 / 4 - r;
    int x = 0, y = r;

    // 八个象限依次计算
    plot(xc, yc, x, y);
    while (x <= y) {
        if (d < 0) {
            d = d + 2 * x + 3;
            x = x + 1;
        } else {
            d = d + 2 * (x - y) + 5;
            x = x + 1;
            y = y - 1;
        }
        plot(xc, yc, x, y);
    }
}

// 极坐标绘制法
void drawPolarCircle(int xc, int yc, int r) {
    glBegin(GL_POINTS);
    for (float theta = 0; theta < 360; theta += 0.1) {
        float x = r * cos(theta * PI / 180);
        float y = r * sin(theta * PI / 180);
        glVertex2f(x + xc, y + yc);
    }
    glEnd();
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glPointSize(1);

    // 设置绘制区域和坐标系范围
    glViewport(0, 0, 640, 480);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 640, 0, 480);

    // 绘制圆形
    glColor3f(1.0, 0.0, 0.0);
    drawMidpointCircle(200, 200, 100);

    glColor3f(0.0, 1.0, 0.0);
    drawPolarCircle(400, 200, 100);

    glFlush();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);          
    glutInitWindowPosition(100, 100);       
    glutCreateWindow("OpenGL Circle");      
    glutDisplayFunc(display);               
    glutMainLoop();                          
    return 0;
}

在上述代码中,我们通过调用gluOrtho2D函数设置了坐标系范围为(0, 0, 640, 480),并使用glViewport函数设置了绘制区域起始坐标为(0, 0)。我们在绘制圆形前先调用glClearColor函数设置背景色。

效果截图

下面是绘制效果截图:

OpenGL Circle

总结

本项目介绍了在C++中使用openGL绘制圆形的两种方法,详细介绍了中点圆绘制算法和极坐标绘制法,并给出了完整的openGL代码片段。通过此文的学习,希望能够帮助读者更好地理解和掌握openGL的绘图方法。