From a19c9966a04f05dea37a7df1d00bb3f2dbd05272 Mon Sep 17 00:00:00 2001 From: biss Date: Sat, 9 May 2026 22:09:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=AE=9E=E9=AA=8C=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab1/1.cpp | 88 +++++++------ lab1/1.exe | Bin 66473 -> 66473 bytes lab1/2.cpp | 122 +++++++++--------- lab1/3.cpp | 146 ++++++++++----------- lab1/3.exe | Bin 68149 -> 67885 bytes lab1/4.cpp | 67 ++++++++++ lab1/4.exe | Bin 0 -> 67886 bytes lab1/5.cpp | 84 ++++++++++++ lab1/5.exe | Bin 0 -> 68149 bytes lab2/lab2.cpp | 350 +++++++++++++++++++++++++------------------------- 10 files changed, 499 insertions(+), 358 deletions(-) create mode 100644 lab1/4.cpp create mode 100644 lab1/4.exe create mode 100644 lab1/5.cpp create mode 100644 lab1/5.exe diff --git a/lab1/1.cpp b/lab1/1.cpp index f37eb87..2d72ae8 100644 --- a/lab1/1.cpp +++ b/lab1/1.cpp @@ -1,54 +1,52 @@ -#include -using namespace std; +#include // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。 +using namespace std; // 使用标准命名空间,方便后续直接使用标准库名称。 -// 回调函数 -void myDisplay() +// 回调函数:GLUT 在需要重绘窗口时会调用它。 +void myDisplay() // 定义绘制窗口内容的函数。 { - // 清除缓冲区 - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - // 正交模式 - glMatrixMode(GL_PROJECTION); - gluOrtho2D(0.0, 500.0, 0.0, 500.0); - glColor4f(0.0, 1.0, 0.0, 0.0); - glRectf(50.0, 50.0, 400.0, 400.0); + // 清除缓冲区前先设置清屏颜色。 + glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景清除颜色为黑色。 + glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区,刷新画布背景。 + // 设置二维正交投影模式。 + glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。 + gluOrtho2D(0.0, 500.0, 0.0, 500.0); // 设置二维坐标范围为 x:[0,500], y:[0,500]。 + glColor4f(0.0, 1.0, 0.0, 0.0); // 设置当前绘图颜色为绿色。 + glRectf(50.0, 50.0, 400.0, 400.0); // 绘制一个左下角为(50,50)、右上角为(400,400)的矩形。 - // 划线 - glColor3f(1.0, 1.0, 0.0); - glBegin(GL_LINES); - glVertex2f(50.0, 50.0); - glVertex2f(400.0, 400.0); - glVertex2f(400.0, 50.0); - glVertex2f(50.0, 400.0); - glEnd(); + // 绘制线段。 + glColor3f(1.0, 1.0, 0.0); // 设置当前绘图颜色为黄色。 + glBegin(GL_LINES); // 开始按线段方式提交顶点。 + glVertex2f(50.0, 50.0); // 指定第一条线段的起点。 + glVertex2f(400.0, 400.0); // 指定第一条线段的终点。 + glVertex2f(400.0, 50.0); // 指定第二条线段的起点。 + glVertex2f(50.0, 400.0); // 指定第二条线段的终点。 + glEnd(); // 结束线段顶点提交。 - // 画点 - glColor3f(1.0, 0.0, 0.0); - glPointSize(20.0); - glBegin(GL_POINTS); - glVertex2f(15.0, 15.0); - glEnd(); + // 绘制点。 + glColor3f(1.0, 0.0, 0.0); // 设置当前绘图颜色为红色。 + glPointSize(20.0); // 设置点的显示大小为 20 像素。 + glBegin(GL_POINTS); // 开始按点方式提交顶点。 + glVertex2f(15.0, 15.0); // 在坐标(15,15)处绘制一个点。 + glEnd(); // 结束点顶点提交。 - // 画三角形 - glBegin(GL_TRIANGLES); - glColor3f(0.0, 0.0, 1.0); - glVertex2i(200, 300); - glVertex2i(100, 100); - glVertex2i(300, 100); - glEnd(); + // 绘制三角形。 + glBegin(GL_TRIANGLES); // 开始按三角形方式提交顶点。 + glColor3f(0.0, 0.0, 1.0); // 设置当前绘图颜色为蓝色。 + glVertex2i(200, 300); // 指定三角形第一个顶点。 + glVertex2i(100, 100); // 指定三角形第二个顶点。 + glVertex2i(300, 100); // 指定三角形第三个顶点。 + glEnd(); // 结束三角形顶点提交。 - - glFlush(); - -} + glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。 +} int main(int argc, char* argv[]) { - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); - glutInitWindowPosition(100, 100); - glutInitWindowSize(500, 500); - glutCreateWindow("The First OpenGL Program"); - glutDisplayFunc(&myDisplay); - glutMainLoop(); - return 0; + glutInit(&argc, argv); // 初始化 GLUT 库。 + glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // 设置显示模式为 RGB 颜色和单缓冲。 + glutInitWindowPosition(100, 100); // 设置窗口左上角初始位置。 + glutInitWindowSize(500, 500); // 设置窗口初始大小为 500x500。 + glutCreateWindow("实验1_03毕爽爽的第一个OpenGL程序"); // 创建标题为指定字符串的窗口。 + glutDisplayFunc(&myDisplay); // 注册显示回调函数。 + glutMainLoop(); // 进入 GLUT 事件循环。 + return 0; } \ No newline at end of file diff --git a/lab1/1.exe b/lab1/1.exe index b90f12ac4b2d4a0d8642b5bdb4d6f817ccf5bd3c..8c8de09723516540d447f8904d0e9a1460735a25 100644 GIT binary patch delta 365 zcmZ44&a$$dWkLsYzvcgl-M&m3mp0x~=4C9N{Eye5-pzu6;S;|As~wO|z{kmP560bWI*OgAe#SWDgkpwb6D3=ID-0HtKPfPz3; zlnFxf{xb(D{Q)G?fF=Qz-UTa#nZ$k_EPrwG7CxnjZD95Wgxa|z{kmP560bWj^OgHOmbC77>0ie;mftyf3!hTNJTQ9(LhW3bvAp$QsY--Y6I?0-EER{4 zN{35%f~DLi>+vg#NFx+{=mxpAn^k0TD!&rPS2K_c-00ff@3=Aimu}ExQXb|tkXtJ5HdPN5SRrqr7 diff --git a/lab1/2.cpp b/lab1/2.cpp index 997f822..2531d4b 100644 --- a/lab1/2.cpp +++ b/lab1/2.cpp @@ -1,80 +1,80 @@ -#include -#include -#include +#include // 引入数学函数库,用于 abs 和 round 等函数。 +#include // 引入输入输出流库,用于打印坐标。 +#include // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。 -// ڿȺ͸߶ -const int WIDTH = 640; -const int HEIGHT = 480; +// 窗口宽度和高度。 +const int WIDTH = 640; // 定义窗口宽度为 640 像素。 +const int HEIGHT = 480; // 定义窗口高度为 480 像素。 -void drawDDALine(int x1, int y1, int x2, int y2) { - float x = x1; - float y = y1; +void drawDDALine(int x1, int y1, int x2, int y2) { // 定义 DDA 直线绘制函数,参数为线段两个端点。 + float x = x1; // 用浮点变量保存当前点的 x 坐标。 + float y = y1; // 用浮点变量保存当前点的 y 坐标。 - // ֵ - int dx = x2 - x1; - int dy = y2 - y1; + // 计算差值。 + int dx = x2 - x1; // 计算终点与起点的 x 方向差值。 + int dy = y2 - y1; // 计算终点与起点的 y 方向差值。 - // ȷȡ dx dy оֵϴǸ - int steps = std::abs(dx) > std::abs(dy) ? std::abs(dx) : std::abs(dy); //Ԫʽ + // 确定步数,取 dx 和 dy 中绝对值较大的那个。 + int steps = std::abs(dx) > std::abs(dy) ? std::abs(dx) : std::abs(dy); // 三元表达式用于选择较大的绝对差值作为步数。 - // ÿһ - float xIncrement = (float)dx / steps; - float yIncrement = (float)dy / steps; + // 计算每一步的增量。 + float xIncrement = (float)dx / steps; // 计算每一步 x 坐标增加的值。 + float yIncrement = (float)dy / steps; // 计算每一步 y 坐标增加的值。 - // ʼƵ - glBegin(GL_POINTS); - glVertex2i((int)round(x), (int)round(y)); // + // 开始绘制点。 + glBegin(GL_POINTS); // 开始按点方式提交顶点。 + glVertex2i((int)round(x), (int)round(y)); // 绘制起点,并将浮点坐标四舍五入为整数坐标。 - for (int k = 0; k < steps; k++) { - x += xIncrement; - y += yIncrement; - // ȡתΪ - std::cout << (int)round(x) << ", " << (int)round(y)<<"\n"; - glVertex2i((int)round(x), (int)round(y)); - } - glEnd(); + for (int k = 0; k < steps; k++) { // 循环 steps 次,逐步生成直线上的像素点。 + x += xIncrement; // 更新当前点的 x 坐标。 + y += yIncrement; // 更新当前点的 y 坐标。 + // 将浮点坐标四舍五入取整转换为整数像素坐标。 + std::cout << (int)round(x) << ", " << (int)round(y)<<"\n"; // 在控制台输出当前绘制点的整数坐标。 + glVertex2i((int)round(x), (int)round(y)); // 将当前点作为 OpenGL 点顶点提交。 + } + glEnd(); // 结束点顶点提交。 } -// ʾص -void display() { - drawDDALine(0, 0, 50, 20); - glFlush(); -} +// 显示回调函数。 +void display() { // 定义窗口重绘时调用的显示函数。 + drawDDALine(0, 0, 50, 20); // 调用 DDA 算法绘制从(0,0)到(50,20)的直线。 + glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。 +} -// ʼ OpenGL +// 初始化 OpenGL 设置。 void init() { - // ñɫΪɫ - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + // 设置背景颜色为白色。 + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置清屏颜色为白色且完全不透明。 +// 空行:分隔背景设置和投影设置。 + // 设置投影矩阵为 2D 正交投影。 + glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。 + glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。 + // 定义可视区域,左下角(0,0),右上角(WIDTH, HEIGHT)。 + gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影坐标范围。 +} - // ͶӰΪ 2D ͶӰ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - // ½(0,0)Ͻ(WIDTH, HEIGHT) - gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); -} +int main(int argc, char** argv) { // 程序入口函数,接收命令行参数。 + // 初始化 GLUT。 + glutInit(&argc, argv); // 初始化 GLUT 库。 -int main(int argc, char** argv) { - // ʼ GLUT - glutInit(&argc, argv); + // 设置显示模式:单缓冲、RGB 颜色模式。 + glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置单缓冲和 RGB 颜色模式。 - // ʾģʽ塢RGB ɫģʽ - glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); + // 设置窗口大小和位置。 + glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小为 WIDTH x HEIGHT。 + glutInitWindowPosition(100, 100); // 设置窗口初始显示位置。 - // ôڴСλ - glutInitWindowSize(WIDTH, HEIGHT); - glutInitWindowPosition(100, 100); + // 创建窗口。 + glutCreateWindow("DDA算法"); // 创建标题为“DDA算法”的窗口。 - // - glutCreateWindow("DDA㷨"); + // 注册回调函数。 + glutDisplayFunc(display); // 注册显示回调函数。 - // עص - glutDisplayFunc(display); + // 初始化设置。 + init(); // 执行 OpenGL 初始化设置。 - // ʼ - init(); + // 进入主循环。 + glutMainLoop(); // 进入 GLUT 事件循环,等待并处理窗口事件。 - // ѭ - glutMainLoop(); - - return 0; -} \ No newline at end of file + return 0; +} \ No newline at end of file diff --git a/lab1/3.cpp b/lab1/3.cpp index f5cd8ba..3603564 100644 --- a/lab1/3.cpp +++ b/lab1/3.cpp @@ -1,86 +1,78 @@ -#include // 引入 GLUT 库,用于创建窗口和处理事件 -#include +#include // 引入 GLUT/OpenGL 头文件,用于创建窗口和绘图。 +#include // 引入输入输出流库,用于在控制台输出点坐标。 +#include // 引入通用工具库,用于 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; -} \ No newline at end of file +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; // 程序正常结束。 +} // 主函数结束。 \ No newline at end of file diff --git a/lab1/3.exe b/lab1/3.exe index 31505c0d688b30e631f32ef94900b1d3d4d4e5c3..4bae78bf2ad349be8f3ddfef513129a219381906 100644 GIT binary patch delta 15218 zcmeI3d3+RAw#TcQboS6mHCYHtI;m{z0m&jT*dT#MKr;&SBBKKY0t5o&LBJ4}P9R7^ zvxFR%h@xQ;!y*KNkgyprN(97!=pZ5nWoBAIi6bh^sCmCzRo#_K&mZ&N=Y2l!pVyyH z^||+Z&pqeddr#e3(s}DSuQw~a%1gtp4Qa~}<_p4RZ$W4k;)MW%p|6m*@zp_w35gr8 z3=+#JRD8m_dYd4W8#YEqQr=EKzeGV0f^j6$Cb5^;m);W-#3cF--)R(PNDv3nP<#)i z>4xDQ%Y&d;g`*>m;dBTM8FUTbkCS(Y1TuE$M8i6C68}Jd=#U`Jq~-XYMLW>)I$Exy zWiI`M+K(N~wMkw-isCaA@BOYgnr?Y#hc{l>~=H-yFh^}ej%5?S$*KMX3u%Ddu16FmKd4lJ5VddxRG z?i1CDok53jrq)&fx~d`HzaBOPXAC)fhlN^T>^}P+#L#u$xUM^5l*rzO8`!930`{As z@64hYzg)2+ZSYG-Jcbp80f%wIQf7Ujza#wy^d5qq!75zAo?ctkYO zp8^sM*P^L3V2U`Hz6p3zETa*D)^0`Xn3s2Kh%(Q%E-2?gL1+tg0FHG8<HQ&~_C@8Rpw+)NvSLg|B`j$#O14eD%nOo(u#2bY~h%vaH|t=Tal80DJ5YW&q5 z6lq&$Oi5#m{I1G_%hK<#c+y*yghTje)~Z8kb)?_H?D{L+ZwyXvSvtm%-Xb>i!lb9)x;fBc zhm-U>E0^68mYW?goQ@tXXcZeowEHT`C^;r*mQMc00=a_#7dGA;jkRO8TFTO$u%&cg zxy-4UVrJ2dMrO*%Oesd4Zc~exDSLV=2DPveF{ddpv$?an=gv|uSTXGmV+W;iy6N^s z9Pc}fM^gl0x@m3$n(jK3u^RX2C`i#BR^J;FHLUIqzK;yRRMxXE=S=uTw+l))JHJ+z zA56jBCc_Y9Xr?NIG9VqsM|AUcrE9$yu7viIQiH`(rSNxCa8NvSA&pE5AIWDGMrQ3H=?a*!r_Dw1kK zV#Y{{4aA_yZ&s@@Tv4QUrde)w$H@C(+p;-uCZjB~^2!EZTbVIJ!N!nS8YguVPtj~C zPJD$nN}a_Ov|Ea{?7P?2#*!gPPdf^o0aWg}D)FdvdO+*b8I^vnN+2qk zbhMMz(BlF6wbLT;YswEDE9TP4&;)S=zPozcBE~w5F(`&pOjwlo0}T)B84|3RKILpu z(mZH?UPX9#@VZVS(y7%}Hr!%!1g!z;olDqH7d`~N z@2M@UD`kdvG^F&Wnc+|2O4t?_L7#_r6o;{rNi};JX0c}mMS?|ApNPn$aVwY^Sc$|e z-7RJnmdM71No=GiogX6?9mdmh1z}}_SY|vy&qT!VTbQqkFHNI)Tsx^<2Wep<17Q!HPJUCd$pu69&st0*q4EscCo6c^B`E<440l-u=$ z+;J9LM$;-J56)x(HO24GIoJ-O1K0)W7qW+iQdYMF%QnE%#x3|}A2{CHn~BifiZC9e zo!uVB&BC|cQVkI~6yH5Tyj}Zf_oH4NpO^+cT#3w39yN`^<(}dbG+Z8)_SIB0C}-Qw zMauL#LItLa4bxVZfw3`Z{FZ60Gahm)@1c`&xBjfoE|bcM`SmL-q;KI!hWTIquYyrv-J^hg$} zLr{iNueRcv1C3m|9-A6C-re<)g%le%ac~#_VmHI=S5sV}T*zmkoHqUlBEsj*Wlkr% z5*VET?DixV25(S(+yl{jK-lNBag$bprP(N|v)LoRHYk39C?2EYgq;Q{hI%JHBECn@ zBt9X|r?ZJ~h-YX)k5sXOcK4WPh_Tdm?Ri!V`Pg3&o_+^go3dv(jL*~EUh(3q6xDm1 z-G83Cskr1RBq-aT{#_ZV>HiOiSOm_Ao zCQGc;-z%E73`p>5=qgxgW3jpRivjx$hUR#xNbW1uZR5Sxb*a6W{3o%0VNaenbmQw) z<$OK3c1r3W#W0u?8lFHHh=Sd-u}^C%T}&J4$K12=Ev}7z@Wl@Hj0iz!E)oPL%Q_3f zRg{^$i^GXBlZzq+;SS17`gIWmp%{H2O@mMKBr>MjVGD7QjRh!TW+l$m@W1~ZE?lL4|ItVNm0$8l7m z%w%)CAZ$mO$@~NafN~M!H#m-=%w(rTL1;qR0$JG8E(n)U!88lkdSgLRZhABkYD5IigGJtE-pH;C^Kp7kI|#dmKb6|S;P`Q6pU%dQAqu*W;dM+ zQliia*0tF6zO(kDN*ba^Wtb?Mp9jgLs2CHkwu7cTK#~id{UT-38 zzyrUi2{ySMD*|f;Q$OUN-qD`6L#>R}WTqykX>z+JU7cF)tAD4}z28tZx@)qx zCWmM;Lz7vWT&_x4ctHa@G})-hbDF&J2AxUojiF8HQ85_YAa6L`|6M0 zSI^Swh4=9itzMzYDplHrT^eZAp~*~5x&qG9>iL>1 z(PV`pG5$RoIHXBe#|Eu_=01K&t6$TkQ9tF>5U9y8O(tqGO_L*;bk9G^y#;d+QB>K1vUD&%yua;QvVurngI; z|9KA9Mm}<@L&$bvM()^oQ>KlcmOVE=Cx5X(#z*_rrabzSfh@oGs_p&z{f1g`yvZO| zZ43DWzH6n-UY#I@=6)$cM9+;25>L>mC9e-$;EpQS3wI@`bo^gvV0Pqmf{OtttCIZARjsr9=!`ZdRr)bxg6Ju zQSf~&9)0u4xLl?c%cZzW9@>c>+Ichy+E<}{%tJfLLpzu1p`Buv;;KEg(>%0ilG!d( zIkd|?w5=Z6(`XK~zp=-fZ60lt=``9#6iMds9+onw|Egqq?n6nuOaaBRxy9Q(N7Hk1 zvoXKtXjpNw`7)M}pS#I4WyLJ|p*XdDo7Trdzgr=TOk;!CLf@~D16agLf6q{hx!7n z6@CG(lPEPYfPVQnnm#Hs$8FcwSv!yFJn|-%_QOKoHB#I(5A6mIZ3_jgk*Rcz6rTC7 zwdrP26fIgK(U)ta_^}>3O&%5_0;pk43=MHe<}_Vh8}V$K;)wE&z)Um;usukeNH06O zc=rS_1uC1;BoW!Ge1-tFDBGI&B(*t04XXp$4rM^kL2D1--P5;gWwC~Cua;@xI-9tJ zmaTKu8&NN#p!Kq$M(Gn!6X@F20_Z|%XUf>nm#!3>m0hi2y-nOmej8-5K{1xG!6w$z zOB){c&PD_cN>~9exx>mQv0OId4VUl~^aYgY_mQ)Ko#i0n1HzhcNr!|3y!K6LK6 zT)eM*@OjzL+L2mU$57GpHt~CUUj-SPdskFO(!dvDMTwq#A}>la?KHhx1i?a$Vre1Ce|_do_nl+27Ewb(DY9?{2nlX`o9=zV(-?q z4|3pf#)8}2EEudg42v1LG07{UCu+AikI5i{7rUT|(`omM32cCuUi?IqX?JB*IH9$b z)87J8MAs`rP2mR3t8f_X8^*}G!$dt^sug?D=P${kg~Uy>@dvIso1%>8p<|(qn?i&8 zx%)Z63L{yfLG{y3wfOVcx|gGdv@ul-K%b}}6m1-_fMjr_FGx#QC9j9OJ&XY??#7^L zgd5HV98UdS2@M|UW+hlBL%Mx zL3X|X4R)qLB))necs|;GYZHVS$^umSkac}0Lu*vUYqM|zG5fVB?>%tT8l{A}$nE`Y zz+8(03*7KLpfOs3g>Lv2;8_(ebwjq*b%{|lm%CvE;A|BZxnVEBa9Pn@;f8|&$EdKx z4Ko3c$;!|W?xm^&h8+ePx*`&3#~#|>*do(+TYTx_magJ+bbCvJSViGmXW-kumF*1M z@clNO#`hVzxivvNLgsCl&De_9M$+j%VZJu>asEtwn82NAKG zH|^3=z%l(e<^xJ(WU^$dtQBG8bV%cw0rZanF|aTM`XD~P)9jR9sMHqwuKW!kh?GH2;7wGc}cjV4;KPo{`{5>@Y$V1o5J zN8f|Juun3Vc=W1NG@5B%jZB?tBy)v_MwOy*iN1wK1vK_}XjC%|^JVPw{N&_OTa9c! zr0Z(~U8YP<=6=a+^O&3(41YE`_ouXP)B1g@Oc2wUMQdq6m-g-*NlidA4@vY3&_!SBy>BE| z@#8}>6&{idSA1y~KnXo@Sf;zsDn&GDH7Q~#T>x2hSP}#2^_o%QT6(NbraOlvLxdmY z?(a-J4)wvhegHVXPBO&%(WcswI3LH<%hZa{eyb0l=!3r#E9rfZx%HAE!;fA#IMV!z z$NHqvXZ5l<(_?-9iSK!TO8=u9aNo-A-m2)+ z6EelVl_CzI(h{GuGXhQbNaO6)T%i3J{gO&gHuD-K*~57gYicnN;bE;o)=sera=~ zOm**t(1k`by#UfkUEamTqERw*^(C+Rk(i~I0EWJc4DzKF^&`#aJi;xd-S5igz8>Lj zqwDV`W6vCQWEnm8UJC7PbgxAni;9wt=2GtISY#<%iDr5XYnXJ@k7cg;IS)6JDY{8E z|AOl#Jh3fT8{vD(Y7{m}c+whtd>Q$_pJJY@&yl8e2_84lm+!~oZ^g`8CG|QZix1Ib zXQJ?Wdfu5(8hgAi?W&HYo-do(4ne=1z_ZrbSaXp_BpLMJS=oF`kHo#Ret#xeTuKRN zWokMr`CV~oP|nFN%ocW{*U>ieoMb-dYI9#YDha)*W0OP!&q>sHPV#GX>ChMNsQvS3 z%Q=~be;|oFXabgw+03P=53pn(NHiYDjYcJEjB+#R(DRaExeq=5E^c(8I*q!Vm+9Df z$uG-o`oq(TX^KB9(XR6n4f+rdsjgOca7{{Z+o6;Ap+t2bN`@gmw7#h`-8<8VVi4~R z;FM;G&OpvRn?hA!v8W$xmc;J#+1XLl9nozC8E`=oz3Itwqv#b7%LR#QE=cC@aIeU( z>o~e_u?w|ch%`I(XJ&1tTaocHSuZX}e|J*-5glaF)ijDGeH4f1M3(X;0kpKN3vF2J zgPrw*kD?-qv6rzA(nPz3-vH8@!0yc{X_*h1w)$!=thlA1q$NT0@}+R^ZK_t?rS9T> z`tv3B#PLsje@IauKPg_N#UCe7GambfI6~;1kIi%$kLx3fLg*gK{>35WxFDqstkOrL z-5ez8W7pma6}fL9Sd{EJyozRg5@ly^r)r=L6M}k&7YD)~4cOeNstnA!$U4PVW8$s9`7C=*X(bn*FFukv(?r69fDRl{IapD<3A0;NBL)F$vw4D6mEmC zkGlGEvgb_ATZ}And&868qO66}g=%j4|G_M~UN5T7d^*B3W=S7f1V}LFY$zj$Se@)S zQ*v|XO%;ThwB$;Z{XfuF&P~Kr5Z8&W`d9?QKKj(I)re}5wQT}vLJ+#nWf1mLUY-2F zbhw-gvzySD%ay($let_O%XBzHlR$#GK`&rBT(3%ygMfO72SAEAJI75pbz8V@=b>ap zH#Ty0^k0Egb2HQm(iN$wkE}a}kf-Qav|hbHGPqS30dmY8(DdoK3m449sawUZ@Y7JL z<^swCDdpVTL59GP?*0IX1rw{2vmjOsT~CY8K=QcEb%NNFIHi98xn4A@qYnsyX>QWu zLDW};uCbN5OhiA{gA55ybS@|7wyl|fBb2$g3g$sQJ z$Yfa7ljJoJ_SH$YSBw4T|oGgray>< z3uv?%sXfA-q*Jw%K9dWm5ZyAA(Yt1M6-X5f=>cs3;b(UXNF}$p`#@ZO1yU2>lo_e* zdS|Sn^H6Hw#_<^le+{|^(#n~R!26pFq_)1{T0!n|I#WOhE@lX#;xVMAcn(JF2tum z8la%-%mpdnoGk-kbFJ%a1gQ$d`KgcN6wpkr+j)>8ZXBP1lydH!AW6{CP5a~83?+f^d+tz>$uO;N7BfLCTrWFF3mYo^`c#`QQ2(ts(}l1tr+6Uy4JDU$-9R$9RZaqFnPpjw7&%jhEe@F>mMK)Txdb~ac3|Wem9UL^wRUM2W|OlsJ)8IjN#By z-rs7Pg7BXpO{nR4PzF-R4e}+BW^N)*gZR2fJ!x+CGjrxm%dUbQ9~|n+eh!^hJ2$ky z0hMxL{|I8?R>liINp-!ZRt-ghu#dj_13bvXAS~teVLSm+$DVZcb89_NRcw3mGDsy% z>rw9qDdmFpoR1UGY2t?Q5hIun)xG*4iWN%0o~6G&_zRTSi1cxY_{r@|&QM1X_R)3X zL3}x#!5|H8GD-7xnG1R}(?QCx|5nr1BNM2}t+XJ2es1<$Trk{(xt#}{L@v`-fUwg- zx3dw1{oYp}*k%y+u&(Qz0=djiLCnAA{ydPAAvd|f20 z&Gwhjxx)n@SzsA@YF^2x_066+X?pFrZ?e6j#wP#A=n>;>!la2~Q*7y@N7=@s_~5kp zQ=Z9~moqn?u6{Q&tbYotkIR{s$I#fEx!F1R)DF8nRqDw9^6T(6Q5@kd<;=;ObYH^_ JAMy8w{{mehAm#u7 delta 15051 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 z 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 diff --git a/lab1/4.cpp b/lab1/4.cpp new file mode 100644 index 0000000..bb9aefe --- /dev/null +++ b/lab1/4.cpp @@ -0,0 +1,67 @@ +#include // 引入 GLUT/OpenGL 头文件,用于创建窗口和绘图。 +#include // 引入输入输出流库,用于在控制台输出点坐标。 +#include // 引入通用工具库,用于 abs 函数。 + +const int WIDTH = 640; // 定义窗口宽度。 +const int HEIGHT = 480; // 定义窗口高度。 + +void drawPoint(int x, int y) { // 定义绘制单个像素点的辅助函数。 + glVertex2i(x, y); // 向 OpenGL 提交一个二维整数坐标点。 + std::cout << x << ", " << y << std::endl; // 在控制台输出当前点坐标。 +} // 绘制点函数结束。 + +void drawBresenhamLine(int x1, int y1, int x2, int y2) { // 定义 Bresenham 直线算法函数。 + 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 err = dx - dy; // 初始化误差项。 + int x = x1; // 初始化当前点的 x 坐标。 + int y = y1; // 初始化当前点的 y 坐标。 + + glBegin(GL_POINTS); // 开始按点方式绘制直线。 + while (true) { // 不断生成直线上的像素点,直到到达终点。 + drawPoint(x, y); // 绘制当前点。 + if (x == x2 && y == y2) { // 判断当前点是否已经到达终点。 + break; // 到达终点后结束循环。 + } // 终点判断结束。 + + int e2 = 2 * err; // 将误差项扩大 2 倍,便于和 dx、dy 比较。 + if (e2 > -dy) { // 如果误差允许在 x 方向前进一步。 + err -= dy; // 更新 x 方向移动后的误差项。 + x += sx; // x 坐标向终点方向移动一步。 + } // x 方向判断结束。 + if (e2 < dx) { // 如果误差允许在 y 方向前进一步。 + err += dx; // 更新 y 方向移动后的误差项。 + y += sy; // y 坐标向终点方向移动一步。 + } // y 方向判断结束。 + } // 像素点生成循环结束。 + glEnd(); // 结束点绘制。 +} // Bresenham 直线算法函数结束。 + +void display() { // 定义显示回调函数。 + glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。 + glColor3f(0.0f, 0.0f, 1.0f); // 设置绘图颜色为蓝色。 + glPointSize(3.0f); // 设置点的大小。 + drawBresenhamLine(50, 50, 500, 300); // 调用 Bresenham 算法绘制一条直线。 + glFlush(); // 强制执行所有 OpenGL 绘图命令。 +} // 显示函数结束。 + +void init() { // 定义 OpenGL 初始化函数。 + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置背景颜色为白色。 + glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。 + glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。 + gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影范围。 +} // 初始化函数结束。 + +int main(int argc, char** argv) { // 程序入口函数。 + glutInit(&argc, argv); // 初始化 GLUT。 + glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为单缓冲和 RGB。 + glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小。 + glutInitWindowPosition(100, 100); // 设置窗口初始位置。 + glutCreateWindow("Bresenham"); // 创建窗口并设置标题。 + init(); // 调用初始化函数。 + glutDisplayFunc(display); // 注册显示回调函数。 + glutMainLoop(); // 进入 GLUT 事件循环。 + return 0; // 程序正常结束。 +} // 主函数结束。 \ No newline at end of file diff --git a/lab1/4.exe b/lab1/4.exe new file mode 100644 index 0000000000000000000000000000000000000000..62f813e854d0cbb522015592eb4f89a48465e2de GIT binary patch literal 67886 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%0AGgAV^%E?Iu1!^9m{gZ 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 // 引入 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; +} diff --git a/lab1/5.exe b/lab1/5.exe new file mode 100644 index 0000000000000000000000000000000000000000..eaedec987fc3800a47ff4592a09cf7f8dae0f46d GIT binary patch literal 68149 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 -#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) - */ -int computeCode(float x, float y, ClipWindow rect) { - int code = INSIDE; - if (x < rect.xmin) code |= LEFT; - else if (x > rect.xmax) code |= RIGHT; - if (y < rect.ymin) code |= BOTTOM; - else if (y > rect.ymax) code |= TOP; - return code; -} - -/** - * Cohen-Sutherland 㷨 - * ע⣺ﴫãֱ޸ֵԵõüĽ - */ -void cohenSutherlandClip(float& x_0, float& y_0, float& x_1, float& y_1, ClipWindow rect) { - int code1 = computeCode(x_0, y_0, rect); - int code2 = computeCode(x_1, y_1, rect); - bool accept = false; - - while (true) { - // ˵㶼ڴ (0000 | 0000 == 0) - if (!(code1 | code2)) { - accept = true; - break; - } - // ˵㶼ڴڵͬһⲿ (綼ߣ0001 & 0001 != 0) λ - else if (code1 & code2) { - break; // ֱ - } - // 3. ߶βڴڣҪ󽻵 - 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); - y = rect.ymax; - } - else if (code_out & BOTTOM) { - x = x_0 + (x_1 - x_0) * (rect.ymin - y_0) / (y_1 - y_0); - y = rect.ymin; - } - else if (code_out & RIGHT) { - y = y_0 + (y_1 - y_0) * (rect.xmax - x_0) / (x_1 - x_0); - x = rect.xmax; - } - else if (code_out & LEFT) { - y = y_0 + (y_1 - y_0) * (rect.xmin - x_0) / (x_1 - x_0); - x = rect.xmin; - } - - // ý滻ԭⲿ˵ - if (code_out == code1) { - x_0 = x; y_0 = y; - code1 = computeCode(x_0, y_0, rect); - } - else { - x_1 = x; y_1 = y; - code2 = computeCode(x_1, y_1, rect); - } - } - } - - // ܣƲü߶Σɫ - if (accept) { - glBegin(GL_LINES); - glColor3f(0.0f, 0.0f, 1.0f); // ɫ - glVertex2f(x_0, y_0); - glVertex2f(x_1, y_1); - glEnd(); - } -} - -// --- ʾص --- -void myDisplay() { - glClear(GL_COLOR_BUFFER_BIT); - - // 1. Ʋü (ɫ߿) - glColor3f(1.0f, 0.0f, 0.0f); // ɫ - glBegin(GL_LINE_LOOP); - glVertex2f(rect.xmin, rect.ymin); - glVertex2f(rect.xmax, rect.ymin); - 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); - cohenSutherlandClip(cx_0, cy_0, cx_1, cy_1, rect); - glLineWidth(1.0); // ָ߿ - - glFlush(); -} - -// --- ʼ --- -void Init() { - glShadeModel(GL_FLAT); - - 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); - glLoadIdentity(); - // öάͶӰΧֵӦ - gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); - glMatrixMode(GL_MODELVIEW); -} - -// --- --- -int main(int argc, char* argv[]) { - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); - glutInitWindowPosition(100, 100); - glutInitWindowSize(600, 400); - glutCreateWindow("ʵ2_03ˬˬ Cohen-Sutherland 㷨"); - - Init(); - - glutDisplayFunc(myDisplay); - glutReshapeFunc(myReshape); - - glutMainLoop(); - return 0; -} \ No newline at end of file +#include // 引入 GLUT/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 标记。 + else if (x > rect.xmax) code |= RIGHT; // 如果点在右边界外,则添加 RIGHT 标记。 + 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,说明整条线段在窗口内。 + accept = true; // 标记线段可以被接受。 + break; // 退出裁剪循环。 + } // 完全可见判断结束。 + // 如果两端点都在窗口的同一侧外部 (例如都在左边:0001 & 0001 != 0) 按位与运算。 + else if (code1 & code2) { // 两个区域编码按位与不为 0,说明线段完全在同一外侧。 + break; // 直接舍弃该线段并退出循环。 + } // 完全不可见判断结束。 + // 3. 线段部分在窗口内,需要求交点。 + 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 坐标。 + y = rect.ymax; // 交点 y 坐标等于上边界。 + } // 上边界求交结束。 + else if (code_out & BOTTOM) { // 如果端点在下边界外,则与下边界求交。 + x = x_0 + (x_1 - x_0) * (rect.ymin - y_0) / (y_1 - y_0); // 根据直线参数方程计算交点 x 坐标。 + y = rect.ymin; // 交点 y 坐标等于下边界。 + } // 下边界求交结束。 + else if (code_out & RIGHT) { // 如果端点在右边界外,则与右边界求交。 + y = y_0 + (y_1 - y_0) * (rect.xmax - x_0) / (x_1 - x_0); // 根据直线参数方程计算交点 y 坐标。 + x = rect.xmax; // 交点 x 坐标等于右边界。 + } // 右边界求交结束。 + else if (code_out & LEFT) { // 如果端点在左边界外,则与左边界求交。 + 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; // 用交点更新第一个端点坐标。 + code1 = computeCode(x_0, y_0, rect); // 重新计算第一个端点的区域编码。 + } // 第一个端点更新结束。 + else { // 否则被裁剪的是第二个端点。 + x_1 = x; y_1 = y; // 用交点更新第二个端点坐标。 + code2 = computeCode(x_1, y_1, rect); // 重新计算第二个端点的区域编码。 + } // 第二个端点更新结束。 + } // 部分可见处理结束。 + } // 裁剪循环结束。 +// 空行:分隔裁剪循环和结果绘制。 + // 如果接受,则绘制裁剪后的线段(蓝色)。 + if (accept) { // 如果线段最终被接受。 + glBegin(GL_LINES); // 开始按线段方式提交顶点。 + glColor3f(0.0f, 0.0f, 1.0f); // 设置绘制颜色为蓝色。 + glVertex2f(x_0, y_0); // 提交裁剪后线段的起点。 + glVertex2f(x_1, y_1); // 提交裁剪后线段的终点。 + glEnd(); // 结束线段顶点提交。 + } // 接受线段绘制结束。 +} // Cohen-Sutherland 裁剪函数结束。 +// 空行:分隔裁剪函数和显示回调函数。 +// --- 显示回调函数 --- +void myDisplay() { // 定义窗口重绘时调用的显示函数。 + glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。 +// 空行:分隔清屏和裁剪窗口绘制。 + // 1. 绘制裁剪窗口 (红色线框)。 + glColor3f(1.0f, 0.0f, 0.0f); // 设置绘制颜色为红色。 + glBegin(GL_LINE_LOOP); // 开始绘制闭合线框。 + glVertex2f(rect.xmin, rect.ymin); // 提交裁剪窗口左下角顶点。 + glVertex2f(rect.xmax, rect.ymin); // 提交裁剪窗口右下角顶点。 + 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); // 切换到投影矩阵模式。 + glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。 + // 设置二维投影范围,与坐标数值对应。 + gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); // 根据窗口宽高设置二维正交投影范围。 + glMatrixMode(GL_MODELVIEW); // 切换回模型视图矩阵模式。 +} // 窗口大小调整回调函数结束。 +// 空行:分隔窗口调整函数和主函数。 +// --- 主函数 --- +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; // 正常结束程序。 +} // 主函数结束。