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

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

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

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

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

一、实验目的及要求

基于一个三角形来进行几何变换,包括绘制多边形、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. 错切变换

六、结论

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

相关文章
|
传感器 算法
esp32使用fft算法显示音乐频谱
esp32使用fft算法显示音乐频谱
985 0
|
网络协议 关系型数据库 MySQL
连接远程mysql数据库失败常见原因及解决办法
1. 没有开启 MySQL 的远程登陆帐号。 1.找到mysql数据库的user表。在user表中新建一条数据,设置User(username)和Host(开放访问MySQL的IP:例如123.118.17.201)以及登录密码。这样就设置了允许访问的用户名和IP地址(若想所有IP都可以访问,则可将Host设置为‘%’,但是这样很危险,不建议)。
10882 0
连接远程mysql数据库失败常见原因及解决办法
|
11月前
|
安全 Linux 网络安全
Metasploit Framework 6.4.99 发布 - 开源渗透测试框架
Metasploit Framework 6.4.99 (macOS, Linux, Windows) - 开源渗透测试框架
303 0
Metasploit Framework 6.4.99 发布 - 开源渗透测试框架
|
11月前
|
存储 缓存 安全
Python类与实例变量:你真的理解它们的区别吗?
本文深入解析Python中类变量与实例变量的区别,通过20个代码案例详解二者在内存、作用域及生命周期上的差异,涵盖应用场景、常见误区及多线程安全等实战问题,助你掌握面向对象编程核心要点。附免费Python教程链接。
439 0
|
人工智能 数据可视化
关于AI编程对普通人的一个最大的缺点
AI虽擅长编码,但图形界面设计能力较弱,普通人难以通过命令行操作。建议集成可视化UI设计工具,如拖拽组件、精准设尺寸,让AI生成代码,减少反复调试,提升效率。
|
算法 Linux 调度
理解CPU负载与使用率
**CPU使用率与负载简介** - **CPU使用率**:指CPU被占用的时间占总时间的比例,单核为直接比例,多核为各核心平均值。高使用率(如80%-90%)表示CPU繁忙,可能导致系统变慢;低使用率(如10%-20%)则表示系统运行流畅。 - **CPU负载**:指等待CPU处理的任务数量,通常显示1分钟、5分钟和15分钟的平均值。高负载意味着任务排队多,可能造成系统卡顿;正常负载下系统运行顺畅。负载反映任务量,使用率反映实际占用时间,两者可不同步。
2694 5
|
Web App开发 网络协议 Unix
客户端请求的端口号是什么?
TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。
客户端请求的端口号是什么?
|
SQL 缓存 测试技术
RESTful API设计的最佳实践:构建高效、可维护的Web服务接口
【6月更文挑战第11天】构建高效、可维护的RESTful API涉及多个最佳实践:遵循客户端-服务器架构、无状态性等REST原则;设计时考虑URL结构(动词+宾语,使用标准HTTP方法)、使用HTTP状态码、统一响应格式及错误处理;确保数据安全(HTTPS、认证授权、输入验证);实施版本控制;并提供详细文档和测试用例。这些实践能提升Web服务接口的性能和质量。
|
数据可视化 前端开发 JavaScript
Echarts+JS实现农业指挥舱可视化大屏!!附源码!!
Echarts+JS实现农业指挥舱可视化大屏!!附源码!!
|
Java Linux Windows
Java“Could Not Create Java Virtual Machine”解决
当在Java中遇到“Could Not Create Java Virtual Machine”错误时,通常是由于内存设置不当、Java版本不兼容、类路径错误或操作系统限制等原因导致JVM无法启动。解决方法包括调整内存参数、确认Java版本兼容性、检查类路径和启动参数、以及检查用户权限和文件系统。
8564 1