矩阵乘法在2D图形中应用

1、一般矩阵乘积

       矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为m X n矩阵,B为n X p矩阵,则他们的乘积AB(有时记做A · B)会是一个m X p矩阵。其乘积矩阵的元素如下面式子得出:

      以上是用矩阵单元的代数系统来说明这类乘法的抽象性质。本节以下各种运算法都是这个公式的不同角度理解,运算结果相等:

2、由定义直接计算

       左边的图表示出要如何计算AB的(1,2)和(3,3)元素,当A是个4×2矩阵和B是个2×3矩阵时。分别来自两个矩阵的元素都依箭头方向而两两配对,把每一对中的两个元素相乘,再把这些乘积加总起来,最后得到的值即为箭头相交位置的值。


3、系数-向量方法

       这种矩阵乘积亦可由稍微不同的观点来思考:把向量和各系数相乘后相加起来。设A和B是两个给定如下的矩阵:

      则

      举个例子来说:


      左面矩阵的列为为系数表,右边矩阵为向量表。例如,第一行是[1 0 2],因此将1乘上第一个向量,0乘上第二个向量,2则乘上第三个向量。

4、向量表方法

      一般矩阵乘积也可以想为是行向量列向量内积。若A和B为给定如下的矩阵:


     且


    其中

    A1是由所有a1,x元素所组成的向量,A2是由所有a2,x元素所组成的向量,以此类推。

    B1是由所有bx,1元素所组成的向量,B2是由所有bx,2元素所组成的向量,以此类推。

    则


5、性质

       矩阵乘法是不可交换的(即AB ≠ BA),除了一些较特别的情况。很清楚可以知道,不可能预期说在改变向量的部份后还能得到相同的结果,而且第一个矩阵的列数必须要和第二个矩阵的行数相同,也可以看出为什么矩阵相乘的顺序会影响其结果。

       虽然矩阵乘法是不可交换的,但AB和BA的行列式总会是一样的(当A、B是同样大小的方阵时)。其解释在行列式条目内。

       当A、B可以被解释为线性算子,其矩阵乘积AB会对应为两个线性算子的复合函数,其中B先做用。

6、二维几何图形变换

       二维图形几何变换有平移,缩放,旋转,错切,反射等几种。二维图形由点或直线段组成的,而直线段又由两个端点连接而成的,从而对二维图形的变换都全部转换成点的变换。

1)平移变换:


      平移变换的变换矩阵为Tm,其中Mx是水平方向移动的距离,My是垂直方向的距离,向左负向右正,向下负向上正。

[x y 1] * Tm = [a1,1[b1,1 b1,2b1,3] + a1,2[b2,1 b2,2 b2,3]+ [a1,3[b3,1 b3,2 b3,3]]

             = [x[10 0] + y[0 1 0] + 1[Mx My 1]]

             = [x+Mx y+My 1]

2)缩放变换

 

      平移变换的变换矩阵为Ts,其中Sx是水平方向上缩放的比例,Sy是竖直方向上缩放的比例,大小1是放大,小于1是缩小,不能等于0。

[x y 1] * Ts = [a1,1[b1,1 b1,2b1,3] + a1,2[b2,1 b2,2 b2,3]+ [a1,3[b3,1 b3,2 b3,3]]

             =[x[Sx 0 0] + y[0 Sy 0] + 1[0 0 1]]

             = [x*Sx y*Sy 1]

3)旋转变换

 

      旋转变换的变换矩阵为Tr,其中sinβ,cosβ均为三角函数,β为以原点旋转的角度数。

[x y 1] * Tr = [a1,1[b1,1 b1,2b1,3] + a1,2[b2,1 b2,2 b2,3]+ [a1,3[b3,1 b3,2 b3,3]]

             =[x[cosβ sinβ 0] + y[-sinβ cosβ 0] + 1[0 0 1]]

             = [x*cosβ-y*sinβ     x*sinβ+y*cosβ     1]

     证明公式:x’=  x*cosβ-y*sinβ, y’= x*sinβ+y*cosβ

 

假设:

    P0(x,y)为原始点,P1(x’,y’)为目标点,r为旋转半径。

x’= r * cos(α+β)

   = r * (cosαcosβ-sinαsinβ)

   = r * cosαcosβ– r * sinαsinβ

   = xcosβ – ysinβ

 

y’= r * sin(α+β)

   = r * (sinαcosβ+cosαsinβ)

   = r * sinαcosβ + r * cosasinβ

   = ycosβ + xsinβ

        总之,在GDI+中,我们可以在Matrix对象中存储仿射变换。由于表示仿射变换的矩阵的第三列总是(0,0,1),因此在构造 Matrix对象时,只需指定前两列中的6个数。语句CFOMatrix matrix = new CFOMatrix(0, 1, -1, 0, 3, 4) 构造下面图形中显示的矩阵。

        可以不将复合变换的三部分存储于三个独立的矩阵,而是一起乘以 A、B 和 C 来得到存储整个复合变换的单个的 3×3 矩阵。假定ABC = D,则一个点乘以 D 得出的结果与一个点先后乘以A、B、C 的结果相同。

       [2 1 1]D = [-2 5 1]

       下图显示了矩阵 A、B、C 和 D。

        复合变换的矩阵可通过将几个单独的变换矩阵相乘而得到,这就意味着任何仿射变换的序列均可存储于单个的 Matrix 对象中。   

警告

       复合变换的顺序非常重要。一般说来,先旋转、再缩放、然后平移,与先缩放、再旋转、然后平移是不同的。同样,矩阵相乘的顺序也是重要的。一般说来,ABC与BAC不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值