完善实验一

This commit is contained in:
biss committed 2026-05-09 22:09:54 +08:00
1 parent 9b639938ed
commit a19c9966a0
10 files changed
+492 -351

No files matched your search

+41 -43
View File
@@ -1,54 +1,52 @@
#include<GL/glut.h> #include<GL/glut.h> // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。
using namespace std; using namespace std; // 使用标准命名空间,方便后续直接使用标准库名称。
// 回调函数 // 回调函数:GLUT 在需要重绘窗口时会调用它。
void myDisplay() void myDisplay() // 定义绘制窗口内容的函数。
{ {
// 清除缓冲区 // 清除缓冲区前先设置清屏颜色。
glClearColor(0.0, 0.0, 0.0, 0.0); glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景清除颜色为黑色。
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区,刷新画布背景。
// 正交模式 // 设置二维正交投影模式。
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
gluOrtho2D(0.0, 500.0, 0.0, 500.0); gluOrtho2D(0.0, 500.0, 0.0, 500.0); // 设置二维坐标范围为 x:[0,500], y:[0,500]。
glColor4f(0.0, 1.0, 0.0, 0.0); glColor4f(0.0, 1.0, 0.0, 0.0); // 设置当前绘图颜色为绿色。
glRectf(50.0, 50.0, 400.0, 400.0); glRectf(50.0, 50.0, 400.0, 400.0); // 绘制一个左下角为(50,50)、右上角为(400,400)的矩形。
// 划线 // 绘制线段。
glColor3f(1.0, 1.0, 0.0); glColor3f(1.0, 1.0, 0.0); // 设置当前绘图颜色为黄色。
glBegin(GL_LINES); glBegin(GL_LINES); // 开始按线段方式提交顶点。
glVertex2f(50.0, 50.0); glVertex2f(50.0, 50.0); // 指定第一条线段的起点。
glVertex2f(400.0, 400.0); glVertex2f(400.0, 400.0); // 指定第一条线段的终点。
glVertex2f(400.0, 50.0); glVertex2f(400.0, 50.0); // 指定第二条线段的起点。
glVertex2f(50.0, 400.0); glVertex2f(50.0, 400.0); // 指定第二条线段的终点。
glEnd(); glEnd(); // 结束线段顶点提交。
// 画点 // 绘制点。
glColor3f(1.0, 0.0, 0.0); glColor3f(1.0, 0.0, 0.0); // 设置当前绘图颜色为红色。
glPointSize(20.0); glPointSize(20.0); // 设置点的显示大小为 20 像素。
glBegin(GL_POINTS); glBegin(GL_POINTS); // 开始按点方式提交顶点。
glVertex2f(15.0, 15.0); glVertex2f(15.0, 15.0); // 在坐标(15,15)处绘制一个点。
glEnd(); glEnd(); // 结束点顶点提交。
// 画三角形 // 绘制三角形。
glBegin(GL_TRIANGLES); glBegin(GL_TRIANGLES); // 开始按三角形方式提交顶点。
glColor3f(0.0, 0.0, 1.0); glColor3f(0.0, 0.0, 1.0); // 设置当前绘图颜色为蓝色。
glVertex2i(200, 300); glVertex2i(200, 300); // 指定三角形第一个顶点。
glVertex2i(100, 100); glVertex2i(100, 100); // 指定三角形第二个顶点。
glVertex2i(300, 100); glVertex2i(300, 100); // 指定三角形第三个顶点。
glEnd(); glEnd(); // 结束三角形顶点提交。
glFlush();
glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。
} }
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
glutInit(&argc, argv); glutInit(&argc, argv); // 初始化 GLUT 库。
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // 设置显示模式为 RGB 颜色和单缓冲。
glutInitWindowPosition(100, 100); glutInitWindowPosition(100, 100); // 设置窗口左上角初始位置。
glutInitWindowSize(500, 500); glutInitWindowSize(500, 500); // 设置窗口初始大小为 500x500。
glutCreateWindow("The First OpenGL Program"); glutCreateWindow("实验1_03毕爽爽的第一个OpenGL程序"); // 创建标题为指定字符串的窗口。
glutDisplayFunc(&myDisplay); glutDisplayFunc(&myDisplay); // 注册显示回调函数。
glutMainLoop(); glutMainLoop(); // 进入 GLUT 事件循环。
return 0; return 0;
} }
BIN
View File
Binary file not shown.
+56 -56
View File
@@ -1,80 +1,80 @@
#include <cmath> #include <cmath> // 引入数学函数库,用于 abs 和 round 等函数。
#include <iostream> #include <iostream> // 引入输入输出流库,用于打印坐标。
#include <GL/glut.h> #include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。
// 窗口宽度和高度 // 窗口宽度和高度。
const int WIDTH = 640; const int WIDTH = 640; // 定义窗口宽度为 640 像素。
const int HEIGHT = 480; const int HEIGHT = 480; // 定义窗口高度为 480 像素。
void drawDDALine(int x1, int y1, int x2, int y2) { void drawDDALine(int x1, int y1, int x2, int y2) { // 定义 DDA 直线绘制函数,参数为线段两个端点。
float x = x1; float x = x1; // 用浮点变量保存当前点的 x 坐标。
float y = y1; float y = y1; // 用浮点变量保存当前点的 y 坐标。
// 计算差值 // 计算差值。
int dx = x2 - x1; int dx = x2 - x1; // 计算终点与起点的 x 方向差值。
int dy = y2 - y1; int dy = y2 - y1; // 计算终点与起点的 y 方向差值。
// 确定步数,取 dx 和 dy 中绝对值较大的那个 // 确定步数,取 dx 和 dy 中绝对值较大的那个。
int steps = std::abs(dx) > std::abs(dy) ? std::abs(dx) : std::abs(dy); //三元表达式 int steps = std::abs(dx) > std::abs(dy) ? std::abs(dx) : std::abs(dy); // 三元表达式用于选择较大的绝对差值作为步数。
// 计算每一步的增量 // 计算每一步的增量。
float xIncrement = (float)dx / steps; float xIncrement = (float)dx / steps; // 计算每一步 x 坐标增加的值。
float yIncrement = (float)dy / steps; float yIncrement = (float)dy / steps; // 计算每一步 y 坐标增加的值。
// 开始绘制点 // 开始绘制点。
glBegin(GL_POINTS); glBegin(GL_POINTS); // 开始按点方式提交顶点。
glVertex2i((int)round(x), (int)round(y)); // 绘制起点 glVertex2i((int)round(x), (int)round(y)); // 绘制起点,并将浮点坐标四舍五入为整数坐标。
for (int k = 0; k < steps; k++) { for (int k = 0; k < steps; k++) { // 循环 steps 次,逐步生成直线上的像素点。
x += xIncrement; x += xIncrement; // 更新当前点的 x 坐标。
y += yIncrement; y += yIncrement; // 更新当前点的 y 坐标。
// 将浮点坐标四舍五入取整转换为整数像素坐标 // 将浮点坐标四舍五入取整转换为整数像素坐标。
std::cout << (int)round(x) << ", " << (int)round(y)<<"\n"; std::cout << (int)round(x) << ", " << (int)round(y)<<"\n"; // 在控制台输出当前绘制点的整数坐标。
glVertex2i((int)round(x), (int)round(y)); glVertex2i((int)round(x), (int)round(y)); // 将当前点作为 OpenGL 点顶点提交。
} }
glEnd(); glEnd(); // 结束点顶点提交。
} }
// 显示回调函数 // 显示回调函数。
void display() { void display() { // 定义窗口重绘时调用的显示函数。
drawDDALine(0, 0, 50, 20); drawDDALine(0, 0, 50, 20); // 调用 DDA 算法绘制从(0,0)到(50,20)的直线。
glFlush(); glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。
} }
// 初始化 OpenGL 设置 // 初始化 OpenGL 设置。
void init() { void init() {
// 设置背景颜色为白色 // 设置背景颜色为白色。
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置清屏颜色为白色且完全不透明。
// 空行:分隔背景设置和投影设置。
// 设置投影矩阵为 2D 正交投影 // 设置投影矩阵为 2D 正交投影。
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
glLoadIdentity(); glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。
// 定义可视区域,左下角(0,0),右上角(WIDTH, HEIGHT) // 定义可视区域,左下角(0,0),右上角(WIDTH, HEIGHT)。
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影坐标范围。
} }
int main(int argc, char** argv) { int main(int argc, char** argv) { // 程序入口函数,接收命令行参数。
// 初始化 GLUT // 初始化 GLUT。
glutInit(&argc, argv); glutInit(&argc, argv); // 初始化 GLUT 库。
// 设置显示模式:单缓冲、RGB 颜色模式 // 设置显示模式:单缓冲、RGB 颜色模式。
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置单缓冲和 RGB 颜色模式。
// 设置窗口大小和位置 // 设置窗口大小和位置。
glutInitWindowSize(WIDTH, HEIGHT); glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小为 WIDTH x HEIGHT。
glutInitWindowPosition(100, 100); glutInitWindowPosition(100, 100); // 设置窗口初始显示位置。
// 创建窗口 // 创建窗口。
glutCreateWindow("DDA算法"); glutCreateWindow("DDA算法"); // 创建标题为“DDA算法”的窗口。
// 注册回调函数 // 注册回调函数。
glutDisplayFunc(display); glutDisplayFunc(display); // 注册显示回调函数。
// 初始化设置 // 初始化设置。
init(); init(); // 执行 OpenGL 初始化设置。
// 进入主循环 // 进入主循环。
glutMainLoop(); glutMainLoop(); // 进入 GLUT 事件循环,等待并处理窗口事件。
return 0; return 0;
} }
Loaded 3 of 10 files, more files were not shown because too many files have changed in this diff. Show more