canvas transform 使用 详解

10 篇文章 0 订阅
2 篇文章 0 订阅

图形的矩阵变换,其实就是图形中每个点的变换

 

Canvas的transform(a,b,c,d,e,f)方法 和Matrix(矩阵)的对应关系

 

_                 _

|     a   c   e   |

|     b   d   f    |

|_   0   0   1 _|

 

Matrix和点(x,y)的对应关系

x 对应第一行,y对应第二行

 

点(x,y)经过矩阵变换后的结果

x' = ax + cy + e;

y' = bx + dy + f;

一个图形初始的Matrix(矩阵) 如下:

_                 _

|     1   0   0   |

|     0   1   0   |

|_   0   0   1 _|

因为每个点 还是它本身

x' = 1*x + 0*y + 0 = x;

y' = 0*x + 1*y + 0 = y;

 

现在进行矩阵的变换:

平移:translate  其实就是对 e和f的变换, e 代表x的平移量,f代表y的平移量

transform(1, 0, 0, 1, 10, 20) = translate(10, 20),x平移10,y平移20

 

_                   _

|     1   0   10   |

|     0   1   20   |

|_   0   0   1   _|

 

缩放:scale  就是对a 和 d 的变换, a代表x的缩放量,d代表y的缩放量

transform(2, 0, 0, 0.5, 0, 0) = scale(2, 0.5), x放大一倍,y缩小一倍

 

_                   _

|     2   0     0   |

|     0   0.5  0   |

|_   0   0     1 _|

 

旋转:rotate,涉及到a,b,c,d四个变量,

transform(cosθ, sinθ, -sinθ, cosθ,0, 0) = rotate(θ),   θ是旋转的角度

 

_                             _

|     cosθ   -sinθ   0    |

|     sinθ   cosθ    0    |

|_   0        0         1  _|

 

拉伸:skew,涉及到 b 和 c两个变量

transform(1, tanθy, tanθx, 1, 0, 0) = rotate(θ),   θy是y轴的倾斜角度,θx是x轴的倾斜角度,此时的a,b应该为1,

ctx.transform(1,Math.tan(Math.PI/180*30),0,1,0,0)

斜切30度,那么就必须用tan把30度包起来,x/y轴都是如此.

 

_                             _

|     1        tanθ   0     |

|     tanθ   1        0     |

|_   0        0        1   _|

 

更多的复杂变换,需要计算出相应的Matrix,并赋给transform就行。

如:镜像,任意对称轴都可以用y = k * x表示

matrix((1-k*k) / (1+k*k), 2k / (1 + k*k), 2k / (1 + k*k), (k*k - 1) / (1+k*k), 0, 0)

 

那么已知对称轴和(x, y),求对称点(x', y')

 

很简单,一是垂直,二是中心点在轴线上,因此有:

(y-y') / (x - x') = -1/ k → ky-ky' = -x+x'
(x + x') / 2 * k = (y + y')/2 → kx+kx' = y+y'

很简单的,把x'y'提出来,就有:

x' = (1-k*k)/(k*k+1) *x + 2k/(k*k+1) *y;
y' = 2k/(k*k+1) *x + (k*k-1)/(k*k+1) *y;

再结合矩阵公式:
x' = ax+cy+e;
y' = bx+dy+f;

我们就可以得到:
a = (1-k*k)/(k*k+1);
b = 2k/(k*k+1);
c = 2k/(k*k+1);
d = (k*k-1)/(k*k+1);

也就是上面matrix方法中的参数值啦!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值