片偏移怎么计算_HTML5的Canvas元素旋转后尺寸计算了解下?

HTML5 Canvas元素旋转后的尺寸和偏移计算解析
本文详细介绍了HTML5 Canvas中元素在经过scale, skew, rotate等变换后,如何计算其坐标偏移和尺寸变化。通过转换矩阵和计算四个顶点的新位置,得出变换后的元素边界框,这对于理解Canvas绘图场景中的元素定位至关重要。" 106082342,8578268,VB.NET编程学习指南,"['vb.net', '.net', '开发语言']

前言

本文主要讲解HTML5中Canvas里面元素因为scale, skew, rotate等作用后导致了元素本身的尺寸和位置的变化,这在很多Canvas元素绘制场景是比较常见的。

1、Canvas中元素坐标变换

1.1、Canvas中元素偏移

假如任何一个元素在Canvas中的定位可以使用originX, originY来指定,而originX又进一步分为left, center, right,而originY又分为top, center, bottom。那么其左上角,右上角,左下角,右下角分别使用一个Map来指定位置:

925d832a80c6f7210f223af22bdf21df.png

这个Map里面使用了0.5为基本单位,是因为我们默认是以元素本身的中心来定位的,即originX, originY都为center的时候通过Map可以保证得到的值为0。

那么假如元素上的某一个点(originY, originY可能不是center)需要移动到中心点(即originX, originY都为center),那么其需要移动的距离怎么算?

61a3b905236a168ed47b060bddee1ac6.png

看看translateToGivenOrigin的方法逻辑?

d97243f3e9b41593dcac53a78553322a.png

在这个方法里面首先将元素的fromOriginX , fromOriginY, toOriginX, toOriginY转化为相对于中心点的偏移。这个偏移很显然是相对于元素的尺寸来说的,所以下面转化为计算元素的尺寸信息。

1.2、Canvas中元素尺寸计算

接下来需要计算的是元素的具体尺寸信息,即_getTransformedDimensions方法的代码逻辑:

011396e4fdfa4bd92cc1f6382b2c1af3.png

下面是上图中的_getNonTransformedDimensions方法的代码:

 _getNonTransformedDimensions = () => { var strokeWidth = this.strokeWidth, w = this.width + strokeWidth, h = this.height + strokeWidth; return { x: w, y: h }; }

而_finalizeDiemensions的代码逻辑如下:

 _finalizeDiemensions = (width, height) => { return this.strokeUniform ? { x: width + this.strokeWidth, y: height + this.strokeWidth } : { x: width, y: height }; }

在上图中重要的方法是_calcDimensionsTransformMatrix:

bb0374e3a99af937fb700e2ab686b619.png

这个方法根据元素当前的skewX, skewY, scaleX, scaleY来计算变换矩形,得到这个矩阵后就可将四个顶点的坐标进行转换:

a7e7b6aa75afc26668ecabb552c77910.png

四个顶点转换后就可计算其组成的矩形区域,就是上面的makeBoundingBoxFromPoints方法:

1374eed2d04d536dfb9fab4c5fa7979a.png

至此四个顶点围成的区域计算好了。

1.3、图解矩阵变换后区域

假如一开始的矩形区域状态如下:

3c8aabc4d86c559c59779af69457f61c.png

那么经过skew, scale, rotate后围成的区域如下:

de1d81d69b885a4cf47e35490541ab9a.png

也就是外层矩形围成的区域了, 可以从makeBoundingBoxFromPoints方法的计算逻辑明显看出来:

97620a328d55f3fe859bf6d54fcbd30b.png

2、本文总结

本文主要讲解了Canvas中元素因scale, skew , rotate等矩阵变换后导致其尺寸,坐标的变化,这在很多绘图场景是比较常见的,比如Fabric.js。通过本文,对于后续Canvas制图中遇到的问题能够有一个基本的思路。我们下期再见~

14ed2ee732cb2611b38100bbda33bed5.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值