#include // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。 #include // 引入输入输出流库,用于输出圆上点坐标。 using namespace std; // 使用标准命名空间,方便直接使用标准库名称。 // 辅助函数:根据圆的八分对称性绘制 8 个对称点。 void plotCirclePoints(int xc, int yc, int x, int y) { // 定义绘制圆对称点的函数。 glBegin(GL_POINTS); // 开始按点方式提交顶点。 // 第一象限相关对称点。 glVertex2i(xc + x, yc + y); // 绘制相对圆心偏移为(+x,+y)的点。 glVertex2i(xc + y, yc + x); // 绘制相对圆心偏移为(+y,+x)的点。 // 第二象限相关对称点。 glVertex2i(xc - y, yc + x); // 绘制相对圆心偏移为(-y,+x)的点。 glVertex2i(xc - x, yc + y); // 绘制相对圆心偏移为(-x,+y)的点。 // 第三象限相关对称点。 glVertex2i(xc - x, yc - y); // 绘制相对圆心偏移为(-x,-y)的点。 glVertex2i(xc - y, yc - x); // 绘制相对圆心偏移为(-y,-x)的点。 // 第四象限相关对称点。 glVertex2i(xc + y, yc - x); // 绘制相对圆心偏移为(+y,-x)的点。 glVertex2i(xc + x, yc - y); // 绘制相对圆心偏移为(+x,-y)的点。 glEnd(); // 结束点顶点提交。 } // 对称点绘制函数结束。 // 中点画圆算法主函数。 // 参数:(xc, yc) 为圆心坐标,r 为半径。 void midpointCircle(int xc, int yc, int r) { // 定义中点画圆算法函数。 int x = 0; // 初始化当前点的 x 坐标为 0。 int y = r; // 初始化当前点的 y 坐标为半径。 // 初始决策参数 d = 3 - 2r。 int d = 3 - 2 * r; // 根据中点画圆算法计算初始判别式。 // 绘制初始点。 plotCirclePoints(xc, yc, x, y); // 利用八分对称绘制初始的 8 个点。 // 循环计算并绘制第一个八分之一圆弧,直到 x <= y 不再成立。 while (x <= y) { // 当 x 未超过 y 时继续生成圆弧点。 x++; // x 坐标向右移动一步。 if (d < 0) { // 判断中点在圆内时的情况。 // 中点在圆内,选择正右方的点 (x+1, y)。 d = d + 4 * x + 6; // 按中点画圆递推公式更新判别式。 } else { // 处理中点在圆外或圆上的情况。 // 中点在圆外或圆上,选择右下方的点 (x+1, y-1)。 d = d + 4 * (x - y) + 10; // 按右下方向选择时的递推公式更新判别式。 y--; // y 坐标向下移动一步。 } std::cout<< xc + x << ", " << yc + y << std::endl; // 输出当前计算得到的圆弧点坐标。 // 绘制由当前 (x, y) 决定的 8 个对称点。 plotCirclePoints(xc, yc, x, y); // 利用八分对称绘制当前点对应的所有对称点。 } glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。 } // 显示回调函数。 void display() { // 定义窗口重绘时调用的显示函数。 glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。 glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色。 glPointSize(2.0f); // 设置绘制点的大小。 // 调用中点画圆算法。 midpointCircle(0, 0, 30); // 以(0,0)为圆心、30为半径绘制圆。 } // 初始化函数。 void init() { // 定义 OpenGL 初始化函数。 glClearColor(0.0, 0.0, 0.0, 1.0); // 设置背景颜色为黑色。 glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。 gluOrtho2D(-250.0, 250.0, -250.0, 250.0); // 定义二维正交投影坐标范围为(-250,-250)到(250,250)。 } // 初始化函数结束。 int main(int argc, char** argv) { // 程序入口函数,接收命令行参数。 glutInit(&argc, argv); // 初始化 GLUT。 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 使用单缓冲和 RGB 颜色模式。 glutInitWindowSize(500, 500); // 设置窗口大小为 500x500。 glutInitWindowPosition(100, 100); // 设置窗口初始位置。 glutCreateWindow("中点画圆算法"); // 创建窗口并设置标题。 init(); // 调用初始化函数。 glutDisplayFunc(display); // 注册显示回调函数。 glutMainLoop(); // 进入 GLUT 事件处理主循环。 return 0; }