完成
This commit is contained in:
+124
@@ -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;
|
||||
}
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user