From d7ae3f6fcc66182e1998ec5dee4152dc1694e11b Mon Sep 17 00:00:00 2001 From: biss Date: Tue, 12 May 2026 13:57:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E9=AA=8C2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/lab2.cpp | 84 +++++++++++++++++++------------------------------- lab2/lab2.exe | Bin 0 -> 68330 bytes 2 files changed, 32 insertions(+), 52 deletions(-) create mode 100644 lab2/lab2.exe diff --git a/lab2/lab2.cpp b/lab2/lab2.cpp index e186017..2667da2 100644 --- a/lab2/lab2.cpp +++ b/lab2/lab2.cpp @@ -1,25 +1,20 @@ -#include // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。 +#include // 引入 OpenGL 头文件,提供窗口和绘图函数。 #include // 引入输入输出流库,便于需要时输出调试信息。 -// 空行:分隔头文件和区域编码定义。 -// --- 定义区域编码 --- + +// 定义区域编码 #define INSIDE 0 // 0000,表示点在裁剪窗口内部。 #define LEFT 1 // 0001,表示点在裁剪窗口左侧。 #define RIGHT 2 // 0010,表示点在裁剪窗口右侧。 #define BOTTOM 4 // 0100,表示点在裁剪窗口下方。 #define TOP 8 // 1000,表示点在裁剪窗口上方。 -// 空行:分隔宏定义和结构体定义。 -// --- 定义裁剪窗口结构 --- + struct ClipWindow { // 定义用于保存裁剪窗口边界的结构体。 float xmin, xmax, ymin, ymax; // 保存裁剪窗口的左、右、下、上边界。 }; // 结构体定义结束。 -// 空行:分隔结构体和全局变量。 -// --- 全局变量设置 --- + ClipWindow rect; // 定义全局裁剪窗口对象。 int x_0, y_0, x_1, y_1; // 定义线段端点坐标变量。 -// 空行:分隔全局变量和函数说明。 -/** // 文档注释开始。 - * 计算点 (x, y) 的区域编码 // 说明 computeCode 函数的作用。 - */ // 文档注释结束。 + int computeCode(float x, float y, ClipWindow rect) { // 根据点坐标和裁剪窗口计算区域编码。 int code = INSIDE; // 初始认为点在窗口内部。 if (x < rect.xmin) code |= LEFT; // 如果点在左边界外,则添加 LEFT 标记。 @@ -27,17 +22,13 @@ int computeCode(float x, float y, ClipWindow rect) { // 根据点坐标和裁剪 if (y < rect.ymin) code |= BOTTOM; // 如果点在下边界外,则添加 BOTTOM 标记。 else if (y > rect.ymax) code |= TOP; // 如果点在上边界外,则添加 TOP 标记。 return code; // 返回最终区域编码。 -} // 区域编码函数结束。 -// 空行:分隔区域编码函数和裁剪函数说明。 -/** // 文档注释开始。 - * Cohen-Sutherland 算法核心 // 说明该函数执行 Cohen-Sutherland 线段裁剪。 - * 注意:这里传入坐标的引用,直接修改坐标值以得到裁剪后的结果 // 说明引用参数会被函数内部更新。 - */ // 文档注释结束。 +} + void cohenSutherlandClip(float& x_0, float& y_0, float& x_1, float& y_1, ClipWindow rect) { // 定义 Cohen-Sutherland 线段裁剪函数。 int code1 = computeCode(x_0, y_0, rect); // 计算第一个端点的区域编码。 int code2 = computeCode(x_1, y_1, rect); // 计算第二个端点的区域编码。 bool accept = false; // 定义是否接受裁剪结果的标志,初始为 false。 -// 空行:分隔初始化和裁剪循环。 + while (true) { // 不断处理线段,直到确定接受或舍弃。 // 如果两端点都在窗口内 (0000 | 0000 == 0)。 if (!(code1 | code2)) { // 两个区域编码按位或为 0,说明整条线段在窗口内。 @@ -52,13 +43,11 @@ void cohenSutherlandClip(float& x_0, float& y_0, float& x_1, float& y_1, ClipWin else { // 线段部分可见,需要把窗口外端点裁到边界上。 int code_out; // 保存当前选中的窗口外端点区域编码。 float x, y; // 保存线段与裁剪边界的交点坐标。 -// 空行:分隔局部变量和外部端点选择。 // 选择窗口外的一个端点。 if (code1 != 0) // 如果第一个端点在窗口外。 code_out = code1; // 选择第一个端点作为待裁剪端点。 else // 否则说明第二个端点在窗口外。 code_out = code2; // 选择第二个端点作为待裁剪端点。 -// 空行:分隔外部端点选择和交点计算。 // 计算交点。 if (code_out & TOP) { // 如果端点在上边界外,则与上边界求交。 x = x_0 + (x_1 - x_0) * (rect.ymax - y_0) / (y_1 - y_0); // 根据直线参数方程计算交点 x 坐标。 @@ -76,7 +65,7 @@ void cohenSutherlandClip(float& x_0, float& y_0, float& x_1, float& y_1, ClipWin y = y_0 + (y_1 - y_0) * (rect.xmin - x_0) / (x_1 - x_0); // 根据直线参数方程计算交点 y 坐标。 x = rect.xmin; // 交点 x 坐标等于左边界。 } // 左边界求交结束。 -// 空行:分隔交点计算和端点替换。 + // 用交点替换原来的外部端点。 if (code_out == code1) { // 如果被裁剪的是第一个端点。 x_0 = x; y_0 = y; // 用交点更新第一个端点坐标。 @@ -85,10 +74,9 @@ void cohenSutherlandClip(float& x_0, float& y_0, float& x_1, float& y_1, ClipWin else { // 否则被裁剪的是第二个端点。 x_1 = x; y_1 = y; // 用交点更新第二个端点坐标。 code2 = computeCode(x_1, y_1, rect); // 重新计算第二个端点的区域编码。 - } // 第二个端点更新结束。 - } // 部分可见处理结束。 - } // 裁剪循环结束。 -// 空行:分隔裁剪循环和结果绘制。 + } + } + } // 如果接受,则绘制裁剪后的线段(蓝色)。 if (accept) { // 如果线段最终被接受。 glBegin(GL_LINES); // 开始按线段方式提交顶点。 @@ -97,9 +85,8 @@ void cohenSutherlandClip(float& x_0, float& y_0, float& x_1, float& y_1, ClipWin glVertex2f(x_1, y_1); // 提交裁剪后线段的终点。 glEnd(); // 结束线段顶点提交。 } // 接受线段绘制结束。 -} // Cohen-Sutherland 裁剪函数结束。 -// 空行:分隔裁剪函数和显示回调函数。 -// --- 显示回调函数 --- +} +// 显示回调函数 void myDisplay() { // 定义窗口重绘时调用的显示函数。 glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。 // 空行:分隔清屏和裁剪窗口绘制。 @@ -111,43 +98,37 @@ void myDisplay() { // 定义窗口重绘时调用的显示函数。 glVertex2f(rect.xmax, rect.ymax); // 提交裁剪窗口右上角顶点。 glVertex2f(rect.xmin, rect.ymax); // 提交裁剪窗口左上角顶点。 glEnd(); // 结束闭合线框顶点提交。 -// 空行:分隔裁剪窗口绘制和原始线段绘制。 + // 2. 绘制原始线段 (绿色)。 - // 注意:为了演示效果,我们在调用裁剪函数前,先保存原始坐标, - // 或者在这里直接用初始值绘制。这里我们使用初始值绘制。 int orig_x_0 = 50, orig_y_0 = 350; // 定义原始线段的第一个端点坐标。 int orig_x_1 = 550, orig_y_1 = 50; // 定义原始线段的第二个端点坐标。 -// 空行:分隔原始坐标定义和原始线段绘制。 + glBegin(GL_LINES); // 开始按线段方式提交顶点。 glColor3f(0.0f, 1.0f, 0.0f); // 设置绘制颜色为绿色。 glVertex2f(orig_x_0, orig_y_0); // 提交原始线段起点。 glVertex2f(orig_x_1, orig_y_1); // 提交原始线段终点。 glEnd(); // 结束原始线段顶点提交。 -// 空行:分隔原始线段绘制和裁剪结果绘制。 + // 3. 执行裁剪并绘制结果 (蓝色)。 - // 使用 float 变量传入,因为算法内部会修改它们。 float cx_0 = orig_x_0, cy_0 = orig_y_0; // 将原始起点复制为浮点变量。 float cx_1 = orig_x_1, cy_1 = orig_y_1; // 将原始终点复制为浮点变量。 -// 空行:分隔裁剪坐标变量和线宽设置。 - // 加粗蓝色线条以便区分。 glLineWidth(3.0); // 设置线宽为 3 像素。 cohenSutherlandClip(cx_0, cy_0, cx_1, cy_1, rect); // 执行裁剪算法并绘制裁剪后的线段。 glLineWidth(1.0); // 恢复线宽。 -// 空行:分隔裁剪结果绘制和刷新。 + glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。 } // 显示回调函数结束。 -// 空行:分隔显示回调函数和初始化函数。 -// --- 初始化设置 --- + +// 初始化设置 void Init() { // 定义初始化函数。 glShadeModel(GL_FLAT); // 设置平面着色模式。 -// 空行:分隔 OpenGL 状态和裁剪窗口边界。 rect.xmin = 100; // 设置裁剪窗口左边界。 rect.xmax = 400; // 设置裁剪窗口右边界。 rect.ymin = 100; // 设置裁剪窗口下边界。 rect.ymax = 300; // 设置裁剪窗口上边界。 -} // 初始化函数结束。 -// 空行:分隔初始化函数和窗口调整函数。 -// --- 窗口大小调整 --- +} + +// 窗口大小调整 void myReshape(int w, int h) { // 定义窗口尺寸变化时的回调函数。 glViewport(0, 0, (GLsizei)w, (GLsizei)h); // 设置视口覆盖整个窗口。 glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。 @@ -155,21 +136,20 @@ void myReshape(int w, int h) { // 定义窗口尺寸变化时的回调函数。 // 设置二维投影范围,与坐标数值对应。 gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); // 根据窗口宽高设置二维正交投影范围。 glMatrixMode(GL_MODELVIEW); // 切换回模型视图矩阵模式。 -} // 窗口大小调整回调函数结束。 -// 空行:分隔窗口调整函数和主函数。 -// --- 主函数 --- -int main(int argc, char* argv[]) { // 程序入口函数,接收命令行参数。 +} + +int main(int argc, char* argv[]) { glutInit(&argc, argv); // 初始化 GLUT。 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // 设置显示模式为 RGB 颜色和单缓冲。 glutInitWindowPosition(100, 100); // 设置窗口初始位置。 glutInitWindowSize(600, 400); // 设置窗口初始大小为 600x400。 glutCreateWindow("实验2_03毕爽爽 Cohen-Sutherland 算法"); // 创建窗口并设置标题。 -// 空行:分隔窗口创建和初始化。 + Init(); // 调用初始化函数,设置裁剪窗口。 -// 空行:分隔初始化和回调注册。 + glutDisplayFunc(myDisplay); // 注册显示回调函数。 glutReshapeFunc(myReshape); // 注册窗口大小变化回调函数。 -// 空行:分隔回调注册和主循环。 + glutMainLoop(); // 进入 GLUT 事件处理主循环。 - return 0; // 正常结束程序。 -} // 主函数结束。 + return 0; +} diff --git a/lab2/lab2.exe b/lab2/lab2.exe new file mode 100644 index 0000000000000000000000000000000000000000..0746bc10fcbce2840e364529d196e6aba51e1ae5 GIT binary patch literal 68330 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%0A6;x0%_e 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