【canvas】canvas基础使用(七):图形变换

简言

学习下canvas图形变换的方法。

canvas变换

在 CanvasRenderingContext2D 渲染背景中的对象会有一个当前的变换矩阵,一些方法可以对其进行控制。
当创建当前的默认路径,绘制文本、图形和 Path2D 对象的时候,会应用此变换矩阵。

translate 图形平移

Canvas 2D API 的 CanvasRenderingContext2D.translate() 方法对当前网格添加平移变换的方法。
语法:
void ctx.translate(x, y);
参数:

  • x
    水平方向的移动距离。

  • y
    垂直方向的移动距离。

translate() 方法,将 canvas 按原始 x 点的水平方向、原始的 y 点垂直方向进行平移变换。
在这里插入图片描述

示例

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// Moved square
ctx.translate(110, 30);
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 80, 80);


在这里插入图片描述

rotate()图形旋转

CanvasRenderingContext2D.rotate() 是 Canvas 2D API 在变换矩阵中增加旋转的方法。角度变量表示一个顺时针旋转角度并且用弧度表示。
语法:
void ctx.rotate(angle);
参数:

  • angle
    顺时针旋转的弧度。如果你想通过角度值计算,可以使用公式: degree * Math.PI / 180 。

旋转中心点一直是 canvas 的起始点。如果想改变中心点,我们可以通过 translate() 方法移动 canvas。
在这里插入图片描述

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// Point of transform origin
ctx.arc(0, 0, 5, 0, 2 * Math.PI);
ctx.fillStyle = "blue";
ctx.fill();

// Non-rotated rectangle
ctx.fillStyle = "gray";
ctx.fillRect(100, 0, 80, 20);

// Rotated rectangle
ctx.rotate((45 * Math.PI) / 180);
ctx.fillStyle = "red";
ctx.fillRect(100, 0, 80, 20);

// Reset transformation matrix to the identity matrix
ctx.setTransform(1, 0, 0, 1, 0, 0);

旋转中心是蓝色的。未旋转的矩形为灰色,而旋转后的矩形为红色。
在这里插入图片描述

scale() 图形缩放

CanvasRenderingContext2D.scale() 是 Canvas 2D API 根据 x 水平方向和 y 垂直方向,为 canvas 单位添加缩放变换的方法。
默认的,在 canvas 中一个单位实际上就是一个像素。例如,如果我们将 0.5 作为缩放因子,最终的单位会变成 0.5 像素,并且形状的尺寸会变成原来的一半。相似的方式,我们将 2.0 作为缩放因子,将会增大单位尺寸变成两个像素。形状的尺寸将会变成原来的两倍。
语法:
void ctx.scale(x, y);
参数:

  • x
    水平方向的缩放因子。负值会使像素在垂直轴上翻转(体现为水平翻转)。值为1将导致不进行水平缩放。

  • y
    垂直方向的缩放因子。负值会使像素在水平轴上翻转(体现为垂直翻转)。数值为 1 时,不进行垂直缩放。

你可以使用 ctx.scale(-1, 1) 水平翻转上下文,使用 ctx.scale(1, -1) 垂直翻转上下文。

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// Scaled rectangle
ctx.scale(9, 3);
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 8, 20);

// Reset current transformation matrix to the identity matrix
ctx.setTransform(1, 0, 0, 1, 0, 0);

// Non-scaled rectangle
ctx.fillStyle = "gray";
ctx.fillRect(10, 10, 8, 20);

在这里插入图片描述

transform() 矩阵变换

CanvasRenderingContext2D.transform() 是 Canvas 2D API 使用矩阵多次叠加当前变换的方法,矩阵由方法的参数进行描述。你可以缩放、旋转、移动和倾斜上下文。

使用方法参数描述的矩阵多次叠加当前的变换矩阵。

语法:
void ctx.transform(a, b, c, d, e, f);
在这里插入图片描述

参数:

  • a (m11)
    水平缩放。

  • b (m12)
    垂直倾斜。

  • c (m21)
    水平倾斜。

  • d (m22)
    垂直缩放。

  • e (dx)
    水平移动。

  • f (dy)
    垂直移动。

示例

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

ctx.transform(1, 0.2, 0.8, 1, 0, 0);
ctx.fillRect(0, 0, 100, 100);

在这里插入图片描述

setTransform() 重新设置矩阵变换

CanvasRenderingContext2D.setTransform() 是 Canvas 2D API 使用单位矩阵重新设置(覆盖)当前的变换并调用变换的方法,此变换由方法的变量进行描述。

重新设置当前的变换为单位矩阵,并使用同样的变量调用 transform() 方法。

语法:
void ctx.setTransform(a, b, c, d, e, f);
参数:

  • a (m11)
    水平缩放。

  • b (m12)
    垂直倾斜。

  • c (m21)
    水平倾斜。

  • d (m22)
    垂直缩放。

  • e (dx)
    水平移动。

  • f (dy)
    垂直移动。

示例

水平倾斜0.2垂直倾斜0.8

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

ctx.setTransform(1, 0.2, 0.8, 1, 0, 0);
ctx.fillRect(0, 0, 100, 100);

在这里插入图片描述

resetTransform() 重置为单位矩阵

CanvasRenderingContext2D.resetTransform() 是 Canvas 2D API 使用单位矩阵重新设置当前变形的方法。
语法:
void ctx.resetTransform();

相当于 ctx.setTransform(1, 0, 0, 1, 0, 0);

结语

图形变换是比较危险的操作,一般搭配canvas的状态方法使用。

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你想在Qt QML中使用Canvas元素绘制图形,并且还需要支持旋转、缩放等功能,你可以使用Canvas变换属性。Canvas元素有一个transform属性,可以对绘制的图形进行旋转、缩放和平移等操作。 例如,如果你想绘制一个矩形并将其旋转45度,你可以使用如下代码: ``` Canvas { id: canvas width: 200 height: 200 onPaint: { var ctx = canvas.getContext("2d"); ctx.save(); // 保存当前的状态 ctx.translate(100, 100); // 将绘制原点移到中心 ctx.rotate(Math.PI / 4); // 旋转45度 ctx.fillRect(-50, -50, 100, 100); // 绘制矩形 ctx.restore(); // 恢复之前的状态 } } ``` 在上面的代码中,我们使用了`ctx.save()`和`ctx.restore()`来保存和恢复绘图状态,以便在旋转后再次绘制其他图形时不会受到影响。 类似地,你也可以使用`ctx.scale()`来进行缩放操作。 例如,如果你想绘制一个圆并将其放大两倍,你可以使用如下代码: ``` Canvas { id: canvas width: 200 height: 200 onPaint: { var ctx = canvas.getContext("2d"); ctx.save(); // 保存当前的状态 ctx.translate(100, 100); // 将绘制原点移到中心 ctx.scale(2, 2); // 放大两倍 ctx.beginPath(); ctx.arc(0, 0, 50, 0, 2 * Math.PI); // 绘制圆形 ctx.fill(); ctx.restore(); // 恢复之前的状态 } } ``` 在上面的代码中,我们使用了`ctx.beginPath()`和`ctx.fill()`来绘制圆形。同时,我们也使用了`ctx.save()`和`ctx.restore()`来保存和恢复绘图状态。 希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZSK6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值