当前位置: 首页 > ds >正文

【第2章 绘制】2.13 坐标变换

文章目录

  • 坐标系的平移、缩放与旋转
    • 平移
    • 旋转
    • 缩放
    • 镜像
  • 自定义的坐标变换


坐标系的平移、缩放与旋转

平移

translate() 方法通过在网格上将画布和原点水平移动 x 单位和垂直移动 y 单位,向当前矩阵添加一个平移变换。

在这里插入图片描述

示例-移动矩形

在这里插入图片描述

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");// 移动的正方形
ctx.translate(110, 30);
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 80, 80);// 重置当前的变换矩阵为单位矩阵
ctx.setTransform(1, 0, 0, 1, 0, 0);// 未移动的正方形
ctx.fillStyle = "gray";
ctx.fillRect(0, 0, 80, 80);

旋转

rotate(angle) 方法用于在变换矩阵中增加旋转。

angle 顺时针旋转的弧度。如果你想通过角度值计算,可以使用公式: degree * Math.PI / 180 。旋转中心点一直是 canvas 的原点。如果想改变中心点,你可以通过 translate() 方法移动画布。

示例-围绕中心旋转矩形

在这里插入图片描述

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");// 未旋转的矩形
ctx.fillStyle = "gray";
ctx.fillRect(80, 60, 140, 30);// 矩阵变换
ctx.translate(150, 75);
ctx.rotate(Math.PI / 2);
ctx.translate(-150, -75);// 旋转后的矩形
ctx.fillStyle = "red";
ctx.fillRect(80, 60, 140, 30);

缩放

scale() 方法用于根据水平和垂直方向,为 canvas 单位添加缩放变换。

默认情况下,在 canvas 中一个单位实际上就是一个像素。例如,如果我们将 0.5 作为缩放因子,最终的单位会变成 0.5 像素,并且形状的尺寸会变成原来的一半。相似的方式,我们将 2.0 作为缩放因子,将会增大单位尺寸变成两个像素。形状的尺寸将会变成原来的两倍。

示例-缩放矩形

在这里插入图片描述

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");// 缩放后的矩形
ctx.scale(9, 3);
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 8, 20);// 将当前变换矩阵重置为单位矩阵
ctx.setTransform(1, 0, 0, 1, 0, 0);// 未缩放的矩形
ctx.fillStyle = "gray";
ctx.fillRect(10, 10, 8, 20);

镜像

镜像也叫水平或垂直翻转,你可以使用 scale(-1, 1) 来将上下文水平翻转,使用 scale(1, -1) 来将其垂直翻转。

在这里插入图片描述

const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')ctx.font = '32px serif'
ctx.fillText('Hello', 10, 80)
ctx.translate(canvas4.width, 0)
ctx.scale(-1, 1)
ctx.fillText('Hello', 10, 80)

自定义的坐标变换

Canvas 的绘图环境对象提供了两个可以直接操作变换矩阵的方法:

transform() 方法用于修改当前的变换矩阵。它接受六个参数:a、b、c、d、e、f,分别对应水平缩放、水平倾斜、垂直倾斜、垂直缩放、水平平移和垂直平移。这个方法不会重置当前的变换矩阵,而是在当前矩阵的基础上进行修改。

setTransform() 方法则不同,它会将当前的变换矩阵重置为单位矩阵,然后根据提供的参数(a、b、c、d、e、f)构建一个新的矩阵。这意味着每次调用 setTransform() 时,之前的变换都会被重置,新的变换从零开始。

ctx.setTransform(1, 0, 0, 1, 0, 0); 这行代码会重置当前的变换矩阵为单位矩阵,并设置一个新的单位矩阵。

在这里插入图片描述

如果一个点原始坐标为 (x,y),那么经过变换后,它的坐标将变为 (ax+cy+e,bx+dy+f)。这意味着:

  • e 和 f 控制上下文的水平和垂直平移。
  • 当 b 和 c 为 0 时,a 和 d 控制上下文的水平和垂直缩放。
  • 当 a 和 d 为 1 时,b 和 c 控制上下文的水平和垂直倾斜。
http://www.xdnf.cn/news/9578.html

相关文章:

  • 数据拟合实验
  • IO 中的阻塞、非阻塞、同步、异步及五种IO模型
  • 服务器定时任务查看和编辑
  • SpringBoot Controller接收参数方式
  • Senna代码解读
  • SQLite软件架构与实现源代码浅析
  • 跨平台开发框架electron
  • 【Linux学习笔记】深入理解动静态库本质及其制作
  • 嵌入式学习笔记 - 用typedef定义函数指针
  • 网络安全十大漏洞
  • 22.代理模式:思考与解读
  • MongoDB选择理由
  • Java设计模式之解释器模式详解
  • flutter使用html_editor_enhanced: ^2.6.0后,编辑框无法获取焦点,无法操作
  • 计算机网络 - 关于IP相关计算题
  • BugKu Web渗透之矛盾
  • Nodejs+http-server 使用 http-server 快速搭建本地图片访问服务
  • 计算机网络(4)——网络层
  • 使用LangChain与多模态模型实现图像中的文字和表格提取(PDF可转图片)
  • Android 插件化
  • 中企出海大会|打造全球化云计算一张网,云网络助力中企出海和AI创新
  • AudioTrack的理解
  • Mini-F5265-OB开发板——UART不定长接收
  • 内联盒模型基本概念?——前端面试中的隐形考点剖析
  • 前端EXCEL插件智表ZCELL数据源功能详解
  • LabVIEW 中内存释放相关问题
  • 2025年渗透测试面试题总结-匿名[校招]安全工程师(甲方)(题目+回答)
  • 第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解
  • [科研实践] VS Code (Copilot) + Overleaf (使用 Overleaf Workshop 插件)
  • RabbitMQ仲裁队列高可用架构解析