完善实验一

This commit is contained in:
2026-05-09 22:09:54 +08:00
Unverified
parent 9b639938ed
commit a19c9966a0
10 changed files with 499 additions and 358 deletions
+69 -77
View File
@@ -1,86 +1,78 @@
#include <GL/glut.h> // 引入 GLUT,用于创建窗口和处理事件
#include <iostream>
#include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,用于创建窗口和绘图。
#include <iostream> // 引入输入输出流库,用于在控制台输出点坐标。
#include <cstdlib> // 引入通用工具库,用于 abs 函数。
using namespace std;
const int WIDTH = 640; // 定义窗口宽度。
const int HEIGHT = 480; // 定义窗口高度。
// 辅助函数:根据八分对称性,绘制8个对称点
void plotCirclePoints(int xc, int yc, int x, int y) {
glBegin(GL_POINTS);
// 第1象限
glVertex2i(xc + x, yc + y);
glVertex2i(xc + y, yc + x);
// 第2象限
glVertex2i(xc - y, yc + x);
glVertex2i(xc - x, yc + y);
// 第3象限
glVertex2i(xc - x, yc - y);
glVertex2i(xc - y, yc - x);
// 第4象限
glVertex2i(xc + y, yc - x);
glVertex2i(xc + x, yc - y);
glEnd();
}
void drawPoint(int x, int y) { // 定义绘制单个像素点的辅助函数。
glVertex2i(x, y); // 向 OpenGL 提交一个二维整数坐标点。
std::cout << x << ", " << y << std::endl; // 在控制台输出当前点坐标。
} // 绘制点函数结束。
// 中点画算法函数
// 参数: (xc, yc) 为圆心坐标, r 为半径
void midpointCircle(int xc, int yc, int r) {
int x = 0;
int y = r;
// 初始决策参数 d = 3 - 2r
int d = 3 - 2 * r;
void drawMidpointLine(int x1, int y1, int x2, int y2) { // 定义中点画线算法函数
int dx = std::abs(x2 - x1); // 计算 x 方向距离的绝对值。
int dy = std::abs(y2 - y1); // 计算 y 方向距离的绝对值。
int sx = (x1 < x2) ? 1 : -1; // 判断 x 坐标每次应该增加还是减少。
int sy = (y1 < y2) ? 1 : -1; // 判断 y 坐标每次应该增加还是减少。
int x = x1; // 初始化当前点的 x 坐标。
int y = y1; // 初始化当前点的 y 坐标。
// 绘制初始点
plotCirclePoints(xc, yc, x, y);
glBegin(GL_POINTS); // 开始按点方式绘制直线。
drawPoint(x, y); // 绘制起点。
// 循环计算并绘制第一个八分之一圆弧,直到 x <= y
while (x <= y) {
x++;
if (d < 0) {
// 中点在圆内,选择正右方的点 (x+1, y)
d = d + 4 * x + 6;
} else {
// 中点在圆外或圆上,选择右下方的点 (x+1, y-1)
d = d + 4 * (x - y) + 10;
y--;
}
std::cout<< xc + x << ", " << yc + y << std::endl;
// 绘制由当前(x, y)决定的8个对称点
plotCirclePoints(xc, yc, x, y);
}
glFlush(); // 强制执行所有OpenGL命令
}
if (dx >= dy) { // 当直线斜率绝对值小于等于 1 时,以 x 为主方向递增。
int d = 2 * dy - dx; // 初始化中点判别式。
while (x != x2) { // 当 x 坐标尚未到达终点时继续循环。
x += sx; // 沿 x 主方向前进一步。
if (d > 0) { // 如果中点位置对应需要选择斜向像素。
y += sy; // y 方向也前进一步。
d += 2 * (dy - dx); // 更新选择斜向像素后的判别式。
} else { // 如果中点位置对应选择水平方向像素。
d += 2 * dy; // 更新选择水平像素后的判别式。
} // 判别式判断结束。
drawPoint(x, y); // 绘制当前计算出的像素点。
} // x 主方向循环结束。
} else { // 当直线斜率绝对值大于 1 时,以 y 为主方向递增。
int d = 2 * dx - dy; // 初始化中点判别式。
while (y != y2) { // 当 y 坐标尚未到达终点时继续循环。
y += sy; // 沿 y 主方向前进一步。
if (d > 0) { // 如果中点位置对应需要选择斜向像素。
x += sx; // x 方向也前进一步。
d += 2 * (dx - dy); // 更新选择斜向像素后的判别式。
} else { // 如果中点位置对应选择竖直方向像素。
d += 2 * dx; // 更新选择竖直像素后的判别式。
} // 判别式判断结束。
drawPoint(x, y); // 绘制当前计算出的像素点。
} // y 主方向循环结束。
} // 斜率情况判断结束。
// --- OpenGL 设置与回调函数 ---
glEnd(); // 结束点绘制。
} // 中点画线算法函数结束。
// 显示回调函数
void display() {
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区
void display() { // 定义显示回调函数
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。
glColor3f(1.0f, 0.0f, 0.0f); // 设置绘图颜色为红色。
glPointSize(3.0f); // 设置点的大小。
drawMidpointLine(50, 50, 500, 300); // 调用中点画线算法绘制一条直线。
glFlush(); // 强制执行所有 OpenGL 绘图命令。
} // 显示函数结束。
glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色
glPointSize(2.0f); // 设置点的大小
void init() { // 定义 OpenGL 初始化函数。
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置背景颜色为白色。
glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影范围。
} // 初始化函数结束。
// 调用中点画圆算法
midpointCircle(50, 50, 30);
}
// 初始化函数
void init() {
glClearColor(0.0, 0.0, 0.0, 1.0); // 设置背景颜色为黑色
glMatrixMode(GL_PROJECTION); // 设置投影矩阵
gluOrtho2D(0.0, 500.0, 0.0, 500.0); // 定义二维正交投影,窗口坐标范围 (0,0) 到 (500,500)
}
// --- 主函数 ---
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化 GLUT
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 使用单缓冲和RGB颜色模型
glutInitWindowSize(500, 500); // 设置窗口大小
glutInitWindowPosition(100, 100); // 设置窗口位置
glutCreateWindow("Midpoint Circle Algorithm"); // 创建窗口并设置标题
init(); // 调用初始化函数
glutDisplayFunc(display); // 注册显示回调函数
glutMainLoop(); // 进入 GLUT 事件处理主循环
return 0;
}
int main(int argc, char** argv) { // 程序入口函数。
glutInit(&argc, argv); // 初始化 GLUT。
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为单缓冲和 RGB。
glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小。
glutInitWindowPosition(100, 100); // 设置窗口初始位置。
glutCreateWindow("中点画线算法"); // 创建窗口并设置标题。
init(); // 调用初始化函数。
glutDisplayFunc(display); // 注册显示回调函数。
glutMainLoop(); // 进入 GLUT 事件循环。
return 0; // 程序正常结束。
} // 主函数结束。