matrix矩陣變換

2021-07-13 18:17:46 字數 2722 閱讀 1874

在css3轉換以及htmal5畫布裡均有元素或圖形的轉換,除了基本的移動、縮放、轉動、拉伸還有乙個能包含上述所有轉換方法的matrix方法,在html5的canvas裡用的是transform,不管是css3還是html5,其轉換的本質是一樣的,不同的是css3裡預設座標原點在中間,html5預設座標在左上角,但都有對應方法可以移動座標軸。下面就總結如何運用matrix方法進行轉換。

雖然在css3裡是對元素進行操作,但本質上是對座標系的變換,元素上每個點都有對應的座標,所以通過對座標系的移動、拉伸就是對座標上的元素移動和拉伸。而構成座標系的是原點和x軸,y軸,所以通過對這三個量進行操作就能變換座標系。值得注意的是這裡的y軸朝下,和數學上的方向相反。

原點的座標是(0,0),x軸上的點座標是(x,0),y軸上點的座標是(0,y),通過對這三個點進行變換則可以對座標軸進行變換,把這三個點的x相加即可得到乙個點的橫座標,把y相加即可得到縱座標。下面先看基本變換是如何實現的。

1、 移動

移動即時對原點的移動,所以原點座標由(0,0)

⇒ (x0

,y0 ),而x和y上的點沒變,所以移動後的點由[(x,0),(0,y),(0,0)]變換為[(x,0),(0,y),(x0

,y0 )]。再來看矩陣如何變換,對於(a,b,c,d,e,f),在矩陣中表示為:⎡⎣

⎢ab0

cd0e

f1⎤⎦

⎥ ,乘以⎡⎣

⎢xy1

⎤⎦⎥ ,結果為⎡⎣

⎢ax+

cy+e

bx+d

y+f0

+0+1

⎤⎦⎥ ,即把每個點的橫座標分別乘以x,y,1相加後得到新點橫座標,把每個點縱座標分別乘以x,y,1得到新點縱座標。所以反過來把[(x,0),(0,y),(x0

,y0 )]分別除以x,y,1即可得到變換矩陣為:[(1,0),(0,1),(x0

,y0 )],在css3中表示為(1,0,0,1,x0

,y0 )。

通過觀察發現座標軸上的點之間距離相等,所以可以用(1,0),(0,1)代表x,y軸,這樣這兩個點加上原點變化後的座標即為需要的矩陣。這樣原始矩陣即為(1,0,0,1,0,0)。

2、 縮放

x、y軸分別縮放tx

,ty 倍後,(1,0)的新座標為(tx

,0),(0,1)的新座標為(0,ty

),原點不變,所以變換矩陣為(tx

,0,0,ty

,0,0)。

3、轉動

轉動即把x、y軸同時轉乙個角度,順時針角度為正,假設角度為θ,通過數學三角函式可以很容易求得轉動後的座標:(1,0)

⇒ (cos⁡θ,sin⁡θ ),(0,1)

⇒ (-sin⁡θ,cos⁡θ ),所以變換矩陣為(cos⁡θ,sin⁡θ,-sin⁡θ,cos⁡θ,0,0)

4、拉伸

拉伸分為x軸向拉伸和y軸向拉伸,設拉伸角分別為θx

,θy 。如圖:

則:(1,0)

⇒ (1,tanθy

),(0,1)

⇒ (tan⁡θx

,1),

所以變換矩陣為(1,tan⁡θy

,tanθx

,1,0,0),所以發現x軸反向拉伸角度為正。

5、其它變換

(1)有了上述理解後其它變換就容易了,比如把一張左右顛倒:

只要把x軸點取反即可,(1,0)

⇒ (-1,0)

所以變換矩陣為(-1,0,0,1,0,0)。

如果想把沿著y=kx的直線翻轉,設(1,0)的對稱點座標(x1

,y1 ),由數學知識可以得到方程組y1

x1−1

=−1k

,y12

=kx1

+12 可得到x1

=1−k

21+k

2 ,y1

=2k1

+k2 。

設(0,1)的對稱點座標為(x2

,y2 ),可得到方程組y2

−1x2

=-1k

,y2+

12=k x2

2 可得到 x2

=2k1

+k2 ,y2

=k2−

11+k

2 ,所以變換矩陣為(1

−k21

+k2,

2k1+

k2,2

k1+k

2,k2

−11+

k2,0

,0)

取k=2,變換為:

(2)不僅可以以(1,0),(0,1)作為基點,可以取任意點作為基點,只要除以相應的倍數就可以得到變換矩陣的值,如把作如下轉換

只要知道兩個對角點座標分別除以寬度、高度的一半即可得到變換矩陣。

變形 矩陣 matrix

matrix 是乙個含六個值的 a,b,c,d,e,f 變換矩陣,用來指定乙個2d變換,相當於直接應用乙個 a b c d e f 變換矩陣。就是基於水平方向 x軸 和垂直方向 y軸 重新定位元素,此屬性值使用涉及到數學中的矩陣,我在這裡只是簡單的說一下css3中的transform有這麼乙個屬性值...

python 翻轉matrix矩陣

題目 給定 matrix 1,2,3 4,5,6 7,8,9 原地旋轉輸入矩陣,使其變為 7,4,1 8,5,2 9,6,3 思路 先沿對角線翻轉,然後沿著中間豎線翻轉。coding utf 8 def print matrix matrix for i in range len matrix ou...

NumPy 陣列 Matrix矩陣

矩陣和陣列的區別,這篇介紹較為詳細 補充一點 numpy 陣列 np.array 可以生成n維陣列,即可以生成一維陣列 二維陣列 三維陣列等任意維數的陣列。數學上將一維陣列稱為向量,將二維陣列稱為矩陣。另外,可以將一般化之後的向量或矩陣等統稱為張量 tensor 一般將將二維陣列稱為 矩陣 將三維陣...