Android Matrix变换

来源:互联网 发布:2018房价知乎 编辑:程序博客网 时间:2024/05/24 01:44

Matrix变换公式:

Matrix变换公式

left [ matrix {scalex # skewx # transx ## skewy # scaley # transy ## persp0 # persp1 #persp2} right ] * left [ matrix{x ## y ## 1} right ] = left [ matrix{x^’ ## y^’ ## 1} right ]

Matrix无参数初始化或reset后是单位矩阵:
这里写图片描述

left [ matrix{1 # 0 # 0 ## 0 # 1 # 0 ## 0 # 0 # 1} right ]

五种掩码类型(单位,平移,缩放,仿射和透视):

    enum TypeMask {        kIdentity_Mask      = 0,        kTranslate_Mask     = 0x01,  //!< set if the matrix has translation        kScale_Mask         = 0x02,  //!< set if the matrix has X or Y scale        kAffine_Mask        = 0x04,  //!< set if the matrix skews or rotates        kPerspective_Mask   = 0x08   //!< set if the matrix is in perspective    };

Matrix的旋转变换:

I.以原点为中心旋转

对于离原点距离为r,与X轴夹角为a的原始点R0(X0,Y0):
原始点r0
left lbrace matrix{ X_{0} = r cos(a) ## Y_{0} = r sin(a)} right none

旋转b角后,新的点R1(X1,Y1):
旋转角度b后的点r1
left lbrace matrix{ X_{1} = r cos(a+b) = r(cos(a)cos(b) - sin(a)sin(b)) = X_{0}cos(b) - Y_{0}sin(b) ## Y_{1} = r sin(a+b) = r(sin(a)cos(b) + sin(b)cos(a)) = Y_{0}cos(b) + X_{0}sin(b)} right none

三角函数公式

转换为矩阵公式即为:
点r0旋转b角矩阵公式
left [ matrix{X_{1} ## Y_{1}} right ] = left [ matrix{cos(b) # -sin(b) ## sin(b) # cos(b)} right ] * left [ matrix{X_{0} ## Y_{0}} right ]

II. 以(px,py)为中心点旋转

以(px,py)为中心点旋转,可分为三步完成:

1. 平移坐标系到(px, py)点:

平移坐标系使(px,py)为原点

2. 以新的原点为中心旋转:

在新原点旋转b角

3. 平移坐标系至原始位置:

平移回坐标系

整个过程即为(注意:矩阵乘法不满足交换率):

整个以(px,py)为中心的旋转过程

整个以(px,py)为中心的旋转过程_1

整个以(px,py)为中心的旋转过程_2

对应函数SkMatrix::setSinCos

Matrix的错切变换:

以(px,py)为中心点做(sx,sy)错切:

以(px,py)为中心点做(sx,sy)错切

以(px,py)为中心点做(sx,sy)错切_最终矩阵

对应函数SkMatrix::setSkew

preconcats和postconcats处理

初始点为P0,转换后为P1,此矩阵为M:

只有此矩阵,没有preconcats和postconcats处理时, P1 = M * P0
preconcats表示参数中的值先于给定矩阵处理(M’ = M * TKS(x,y)) 即 P1 = M’ * P0 = M * TKS(x,y) * P0
postconcats表示参数中的值在矩阵处理后再处理(M’ = TKS(x,y) * M) 即 P1 = M’ * P0 = TKS(x,y) * M * P0

以点P0(2,0),做T(1,0)平移和S(3,1)缩放:

先平移,再缩放,P1位置为(3,0);
先缩放,再平移,P1位置为(5,0);

0 0
原创粉丝点击