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):
left lbrace matrix{ X_{0} = r cos(a) ## Y_{0} = r sin(a)} right none
旋转b角后,新的点R1(X1,Y1):
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
转换为矩阵公式即为:
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)点:
left [ matrix{X_{1} ## Y_{1} ## 1} right ] = left [ matrix {1 # 0 # -px ## 0 # 1 # -py ## 0 # 0 #1} right ] * left [ matrix{X_{0} ## Y_{0} ## 1} right ]
2. 以新的原点为中心旋转:
left [ matrix{X_{2} ## Y_{2} ## 1} right ] = left [ matrix { cos(b) # - sin( b ) # 0 ## sin(b) # cos(b) # 0 ## 0 # 0 #1} right ] * left [ matrix{X_{1} ## Y_{1} ## 1} right ]
3. 平移坐标系至原始位置:
left [ matrix{X_{3} ## Y_{3} ## 1} right ] = left [ matrix {1 # 0 # px ## 0 # 1 # py ## 0 # 0 #1} right ] * left [ matrix{X_{2} ## Y_{2} ## 1} right ]
整个过程即为(注意:矩阵乘法不满足交换率):
left [ matrix{X_{3} ## Y_{3} ## 1} right ] = left [ matrix {1 # 0 # px ## 0 # 1 # py ## 0 # 0 #1} right ] * left [ matrix { cos(b) # - sin( b ) # 0 ## sin(b) # cos(b) # 0 ## 0 # 0 #1} right ] * left [ matrix {1 # 0 # -px ## 0 # 1 # -py ## 0 # 0 #1} right ] * left [ matrix{X_{0} ## Y_{0} ## 1} right ]
left [ matrix{X_{3} ## Y_{3} ## 1} right ] = left [ matrix { cos(b) # - sin( b ) # px ## sin(b) # cos(b) # py ## 0 # 0 #1} right ] * left [ matrix {1 # 0 # -px ## 0 # 1 # -py ## 0 # 0 #1} right ] * left [ matrix{X_{0} ## Y_{0} ## 1} right ]
left [ matrix{X_{3} ## Y_{3} ## 1} right ] = left [ matrix { cos(b) # - sin( b ) # sin(b)*py+(1-cos(b))*px ## sin(b) # cos(b) # (1-cos(b))*py-sin(b)*px ## 0 # 0 #1} right ] * left [ matrix{X_{0} ## Y_{0} ## 1} right ]
对应函数SkMatrix::setSinCos
Matrix的错切变换:
以(px,py)为中心点做(sx,sy)错切:
left [ matrix{X_{1} ## Y_{1} ## 1} right ] = left [ matrix {1 # 0 # px ## 0 # 1 # py ## 0 # 0 #1} right ] * left [ matrix { 1 # sx # 0 ## sy # 1 # 0 ## 0 # 0 #1} right ] * left [ matrix {1 # 0 # -px ## 0 # 1 # -py ## 0 # 0 #1} right ] * left [ matrix{X_{0} ## Y_{0} ## 1} right ]
left [ matrix{X_{1} ## Y_{1} ## 1} right ] = left [ matrix {1 # sx # -sxpy ## sy # 1 # -sypx ## 0 # 0 #1} right ] * left [ matrix{X_{0} ## Y_{0} ## 1} right ]
对应函数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);