diff --git a/lab3/lab3.cpp b/lab3/lab3.cpp new file mode 100644 index 0000000..729a02f --- /dev/null +++ b/lab3/lab3.cpp @@ -0,0 +1,124 @@ +#include // 引入OpenGL 头文件,提供窗口和绘图函数。 +#include // 引入数学函数库,用于计算正弦和余弦。 + +const int WIDTH = 800; // 定义窗口宽度。 +const int HEIGHT = 800; // 定义窗口高度。 +const float PI = 3.1415926f; // 定义圆周率常量。 + +struct Point { // 定义用于保存二维点坐标的结构体。 + float x; // 保存点的 x 坐标。 + float y; // 保存点的 y 坐标。 +}; + +// 定义原始三角形的三个顶点。 +Point original[3] = { + {200.0f, 300.0f}, + {200.0f, 200.0f}, + {300.0f, 200.0f} +}; +// 绘制指定颜色的三角形。 +void drawTriangle(Point p[3], float r, float g, float b) { + glColor3f(r, g, b); // 设置绘制颜色。 + + glBegin(GL_TRIANGLES); // 开始按实心三角形方式提交顶点。 + for (int i = 0; i < 3; i++) { // 依次提交三角形的三个顶点。 + glVertex2f(p[i].x, p[i].y); // 提交当前顶点坐标。 + } + glEnd(); // 结束实心三角形绘制。 +} + +void translateTriangle(Point src[3], Point dst[3], float tx, float ty) { // 对三角形进行平移变换。 + for (int i = 0; i < 3; i++) { // 依次处理每个顶点。 + dst[i].x = src[i].x + tx; // x 坐标加上平移量 tx。 + dst[i].y = src[i].y + ty; // y 坐标加上平移量 ty。 + } +} + +void scaleTriangle(Point src[3], Point dst[3], float sx, float sy) { // 对三角形进行缩放变换。 + for (int i = 0; i < 3; i++) { // 依次处理每个顶点。 + dst[i].x = src[i].x * sx; // x 坐标乘以缩放系数 sx。 + dst[i].y = src[i].y * sy; // y 坐标乘以缩放系数 sy。 + } +} + +void rotateTriangle(Point src[3], Point dst[3], float angleDeg) { // 对三角形进行旋转变换。 + float rad = angleDeg * PI / 180.0f; // 将角度转换为弧度。 + float c = cos(rad); // 计算旋转角的余弦值。 + float s = sin(rad); // 计算旋转角的正弦值。 + + for (int i = 0; i < 3; i++) { // 依次处理每个顶点。 + dst[i].x = src[i].x * c - src[i].y * s; // 根据旋转公式计算新的 x 坐标。 + dst[i].y = src[i].x * s + src[i].y * c; // 根据旋转公式计算新的 y 坐标。 + } +} + +void drawAxes() { // 绘制坐标轴,便于观察图形位置。 + glColor3f(0.75f, 0.75f, 0.75f); // 设置坐标轴颜色为灰色。 + glLineWidth(1.0f); // 设置坐标轴线宽。 + glBegin(GL_LINES); // 开始按线段方式提交顶点。 + glVertex2f(0.0f, 0.0f); // 提交 x 轴起点。 + glVertex2f(500.0f, 0.0f); // 提交 x 轴终点。 + glVertex2f(0.0f, 0.0f); // 提交 y 轴起点。 + glVertex2f(0.0f, 500.0f); // 提交 y 轴终点。 + glEnd(); // 结束坐标轴绘制。 +} + +void myDisplay() { // 定义窗口重绘时调用的显示函数。 + glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。 + + drawAxes(); // 绘制坐标轴。 + + Point temp[3]; // 临时保存变换后的顶点坐标。 + + // 1. 绘制原始三角形,颜色为红色。 + drawTriangle(original, 1.0f, 0.0f, 0.0f); + + // 2. 绘制平移后的三角形,颜色为绿色。 + translateTriangle(original, temp, 100.0f, 0.0f); + drawTriangle(temp, 0.0f, 0.75f, 0.0f); + + translateTriangle(original, temp, 0.0f, -100.0f); + drawTriangle(temp, 0.0f, 0.75f, 0.0f); + + // 3. 绘制缩放后的三角形,颜色为品红色。 + scaleTriangle(original, temp, 0.5f, 0.5f); + drawTriangle(temp, 1.0f, 0.0f, 1.0f); + + scaleTriangle(original, temp, 1.0f, 1.5f); + drawTriangle(temp, 1.0f, 0.0f, 1.0f); + + scaleTriangle(original, temp, 1.5f, 1.5f); + drawTriangle(temp, 1.0f, 0.0f, 1.0f); + + // 4. 绘制旋转后的三角形,颜色为蓝色。 + rotateTriangle(original, temp, 30.0f); // 逆时针旋转 30 度。 + drawTriangle(temp, 0.0f, 0.0f, 1.0f); + + rotateTriangle(original, temp, -33.0f); // 顺时针旋转 33 度。 + drawTriangle(temp, 0.0f, 0.0f, 1.0f); + + glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。 +} + +void Init() { + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 设置背景颜色为黑色。 + glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。 + glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。 + gluOrtho2D(-20.0, 500.0, -20.0, 500.0); // 设置二维正交投影范围。 +} + +int main(int argc, char** argv) { // 程序入口函数。 + glutInit(&argc, argv); // 初始化 GLUT。 + glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为 RGB 颜色和单缓冲。 + glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口初始大小。 + glutInitWindowPosition(100, 100); // 设置窗口初始位置。 + glutCreateWindow("实验3_03毕爽爽 图形几何变换"); // 创建窗口并设置标题。 + + Init(); // 调用初始化函数。 + + glutDisplayFunc(myDisplay); // 注册显示回调函数。 + + glutMainLoop(); // 进入 GLUT 事件处理主循环。 + return 0; +} + diff --git a/lab3/lab3.exe b/lab3/lab3.exe new file mode 100644 index 0000000..97954c8 Binary files /dev/null and b/lab3/lab3.exe differ diff --git a/lab4/lab4.cpp b/lab4/lab4.cpp index 1ea02c9..e8ab0c9 100644 --- a/lab4/lab4.cpp +++ b/lab4/lab4.cpp @@ -99,7 +99,7 @@ int main(int argc, char** argv) { // 程序入口函数,接收命令行参数 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为 RGB 颜色和单缓冲。 glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小为 WIDTH x HEIGHT。 glutInitWindowPosition(100, 100); // 设置窗口初始显示位置。 - glutCreateWindow("实验3_03毕爽爽 三次Bezier曲线"); // 创建窗口并设置标题。 + glutCreateWindow("实验4_03毕爽爽 三次Bezier曲线"); // 创建窗口并设置标题。 Init(); // 调用初始化函数。 glutDisplayFunc(myDisplay); // 注册显示回调函数。 diff --git a/lab4/lab4.exe b/lab4/lab4.exe new file mode 100644 index 0000000..b0b1f93 Binary files /dev/null and b/lab4/lab4.exe differ