完善实验一
This commit is contained in:
+84
@@ -0,0 +1,84 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user