Android Matrix变换

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)为原点

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. 以新的原点为中心旋转:

在新原点旋转b角
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 ]

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

整个以(px,py)为中心的旋转过程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 ]

整个以(px,py)为中心的旋转过程_1left [ 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 ]

整个以(px,py)为中心的旋转过程_2left [ 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)错切:

以(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 ]

以(px,py)为中心点做(sx,sy)错切_最终矩阵
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值