【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换

简介: 【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

实验四、二维图形的缩放、旋转,平移,组合变换

一、实验目的及要求

基于一个三角形来进行几何变换,包括绘制多边形、XY二维坐标、平移变换、对称变换、缩放变换、旋转变换、错切变换 ,通过实验,熟练掌握图形几何变换的基本思想和基本方法。

二、实验设备

  • Microsoft Visual Studio 2022

三、实验原理

图形几何变换主要涉及以下几种操作:

  • 平移变换:将图形沿着X轴和Y轴方向进行平移。
  • 对称变换:通过某个轴或点对图形进行对称镜像。
  • 缩放变换:按比例调整图形的大小。
  • 旋转变换:围绕某个点或轴旋转图形。
  • 错切变换:沿着X轴或Y轴方向拉伸图形。

四、实验方法与步骤

  1. 算法思想
  • 平移变换:将每个顶点的坐标分别加上平移向量得到新的坐标。
  • 对称变换:根据对称轴或对称点的位置,改变每个顶点的坐标。
  • 缩放变换:将每个顶点的坐标按照比例因子进行缩放计算。
  • 旋转变换:围绕旋转中心点,将每个顶点的坐标按照旋转角度进行计算。
  • 错切变换:根据错切类型和参数,计算每个顶点的新坐标。
  1. 算法步骤
  • 绘制多边形:根据给定的顶点坐标,使用OpenGL库函数进行多边形绘制。
  • XY二维坐标:绘制坐标轴,并在图形上绘制坐标轴上的点。
  • 平移变换:根据给定的平移向量,对图形中的每个顶点坐标进行平移计算。
  • 对称变换:根据给定的对称轴或对称点,对图形中的每个顶点坐标进行对称变换计算。
  • 缩放变换:根据给定的缩放因子,对图形中的每个顶点坐标进行缩放计算。
  • 旋转变换:根据给定的旋转角度和旋转中心点,对图形中的每个顶点坐标进行旋转计算。
  • 错切变换:根据给定的错切类型和参数,对图形中的每个顶点坐标进行错切计算。
  1. 代码
void drawPolygon() {
    glColor3f(0.0, 0.0, 0.0); // 设置颜色为黑色
    glBegin(GL_POLYGON); // 绘制多边形
    for (int i = 0; i < n; ++i) {
        glVertex2f(vertices[i][0], vertices[i][1]); // 添加多边形顶点
    }
    glEnd();
}

void drawAxes() {
    glColor3f(0.0, 0.0, 0.0); // 设置颜色为黑色
    glBegin(GL_LINES); // 绘制线段
    glVertex2f(-250, 0); // X轴起点
    glVertex2f(250, 0); // X轴终点
    glVertex2f(0, -250); // Y轴起点
    glVertex2f(0, 250); // Y轴终点
    glEnd();
}

void translate(float tx, float ty) {
    for (int i = 0; i < n; ++i) {
        vertices[i][0] += tx; // 平移x坐标
        vertices[i][1] += ty; // 平移y坐标
    }
}

void reflectX() {
    for (int i = 0; i < n; ++i) {
        vertices[i][1] = -vertices[i][1]; // 关于X轴反射
    }
}

void reflectY() {
    for (int i = 0; i < n; ++i) {
        vertices[i][0] = -vertices[i][0]; // 关于Y轴反射
    }
}

void scale(float sx, float sy) {
    for (int i = 0; i < n; ++i) {
        vertices[i][0] *= sx; // 缩放x坐标
        vertices[i][1] *= sy; // 缩放y坐标
    }
}

void rotate(float angle) {
    float theta = angle * M_PI / 180.0; // 角度转弧度
    for (int i = 0; i < n; ++i) {
        float x = vertices[i][0];
        float y = vertices[i][1];
        vertices[i][0] = x * cos(theta) - y * sin(theta); // 绕原点旋转
        vertices[i][1] = x * sin(theta) + y * cos(theta);
    }
}

void shear(float shx, float shy) {
    for (int i = 0; i < n; ++i) {
        float x = vertices[i][0];
        float y = vertices[i][1];
        vertices[i][0] = x + shx * y; // 剪切x坐标
        vertices[i][1] = y + shy * x; // 剪切y坐标
    }
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区
    glColor3f(1.0, 1.0, 1.0); // 设置绘制颜色为白色
    drawAxes(); // 绘制坐标轴
    drawPolygon(); // 绘制多边形
    glFlush(); // 刷新缓冲区,将图像显示出来
}

五、实验结果

  1. 绘制多边形,XY二维坐标

  1. 平移变换

  1. 对称变换

  1. 缩放变换

  1. 旋转变换

  1. 错切变换

六、结论

通过本次实验,我掌握了图形几何变换的基本思想和方法,并成功实现了多边形的绘制、平移变换、对称变换、缩放变换、旋转变换和错切变换等操作。这些几何变换可以应用于许多图形设计和计算机图形学领域,为图形的变换和处理提供了强大的工具和技术支持。

相关文章
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
231 0
|
3月前
第4章-变换-4.1-基础变换
第4章-变换-4.1-基础变换
22 0
|
6月前
|
存储 算法 图形学
【计算机图形学】实验二 用扫描线算法实现多边形填充
【计算机图形学】实验二 用扫描线算法实现多边形填充
202 2
|
6月前
|
算法
[Halcon&几何] 矩形顶点和对角连线角度计算
[Halcon&几何] 矩形顶点和对角连线角度计算
132 0
|
图形学
Unity 之 获取物体的旋转角正确数值
不管父物体如何设置,都能获取到物体本身旋转角度的正确数值
1060 0
|
算法 图形学
【计算机图形学】实验三:二维图形变换
【计算机图形学】实验三:二维图形变换
251 0
【计算机图形学】实验三:二维图形变换
|
前端开发 数据可视化 图形学
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
152 0
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
|
传感器 JSON 数据可视化
【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?
【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?
196 0
【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?
|
算法 图形学
【计算机图形学】实验四:线段裁剪
【计算机图形学】实验四:线段裁剪
122 0
【计算机图形学】实验四:线段裁剪
|
图形学
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
430 1
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用