This commit is contained in:
2026-05-12 14:53:55 +08:00
Unverified
parent b05893f9ef
commit e75eed82b1
4 changed files with 125 additions and 1 deletions
+124
View File
@@ -0,0 +1,124 @@
#include <GL/glut.h> // 引入OpenGL 头文件,提供窗口和绘图函数。
#include <cmath> // 引入数学函数库,用于计算正弦和余弦。
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;
}
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -99,7 +99,7 @@ int main(int argc, char** argv) { // 程序入口函数,接收命令行参数
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为 RGB 颜色和单缓冲。 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为 RGB 颜色和单缓冲。
glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小为 WIDTH x HEIGHT。 glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小为 WIDTH x HEIGHT。
glutInitWindowPosition(100, 100); // 设置窗口初始显示位置。 glutInitWindowPosition(100, 100); // 设置窗口初始显示位置。
glutCreateWindow("实验3_03毕爽爽 三次Bezier曲线"); // 创建窗口并设置标题。 glutCreateWindow("实验4_03毕爽爽 三次Bezier曲线"); // 创建窗口并设置标题。
Init(); // 调用初始化函数。 Init(); // 调用初始化函数。
glutDisplayFunc(myDisplay); // 注册显示回调函数。 glutDisplayFunc(myDisplay); // 注册显示回调函数。
BIN
View File
Binary file not shown.