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

【第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 控制上下文的水平和垂直倾斜。

相关文章:

  • HA-820A程控高压放大器详解
  • vue2指令方式防抖功能
  • CEH Practical 实战考试真题与答案
  • 【第2章 绘制】2.7 路径、描边与填充
  • 企业信息管理系统的设计与实现(代码+数据库+LW)
  • 开源架构在移动端开发中的卓越应用与深度解析
  • 基于c++11重构的muduo核心库项目梳理
  • node_modules\node-sass: Command failed.报错了
  • Java设计模式之命令模式详解
  • YARN架构解析:大数据资源管理核心
  • Browser-use快速了解
  • WifiEspNow库函数详解
  • 树莓派搭配 Tailscale 搭建个人云网盘
  • SpringBoot3.4.5 开启虚拟线程(JDK21)
  • Spring测试框架全面解析
  • 【JavaSE】异常处理学习笔记
  • GRIT:让AI“指着图说话“的新思路
  • 【AGI】Qwen3模型高效微调
  • 234. Palindrome Linked List
  • ISOLAR软件生成报错处理(四)
  • 网页设计网站建设过程报告/长沙企业关键词优化哪家好
  • 成都网站建设公司排名/东莞最新消息 今天
  • 舟山城乡建设培训中心网站/汕头网站建设方案维护
  • 风景网站模板/哪个搜索引擎最好用
  • 5大动态网站资料/网络推广怎么做才有效
  • 陕西网站建设报价/长春网站建设团队