Files
Computer-Graphics-Lab/lab1/5.cpp
T
2026-05-09 22:09:54 +08:00

85 lines
4.2 KiB
C++

#include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。
#include <iostream> // 引入输入输出流库,用于输出圆上点坐标。
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;
}