仿射變換

仿射變換是空間直角座標變換的一種,它是一種二維座標到二維座標之間的線性變換,保持二維圖形的“平直線”和“平行性”,其可以通過一系列的原子變換的複合來實現,包括平移(Translation)、縮放(Scale)、翻轉(Flip)、旋轉(Rotation)和剪切(Shear)。

此類變換可以用一個3×3的矩陣來表示,其最後一行爲(0, 0, 1)。該變換矩陣將原座標(x, y)變換爲新座標(x', y'),這裏原座標和新座標皆視爲最末一行爲(1)的三維列向量,原列向量左乘變換矩陣得到新的列向量:

[x']   [m00 m01 m02] [x]   [m00*x+m01*y+m02]

[y'] = [m10 m11 m12] [y] = [m10*x+m11*y+m12]

[1 ]   [ 0   0   1 ] [1]   [     1         ]

用代數式表示如下:

x’ = m00*x+m01*y+m02;

             y’ = m10*x+m11*y+m12;

如果將它寫成按旋轉、縮放、平移三個分量的複合形式,則其代數式如下:

X= (x-x0)cosθ+(y-y0)sinθ+x0
Y=-(x-x0)sinθ+(y-y0)cosθ+y0

 


    其示意圖如下:


幾種典型的仿射變換:

1.public static AffineTransform getTranslateInstance(double tx, double ty)

平移變換,將每一點移動到(x+tx, y+ty),變換矩陣爲:

[   1    0    tx  ]

[   0    1    ty  ]

[   0    0    1   ]

(譯註:平移變換是一種“剛體變換”,rigid-body transformation,中學學過的物理,都知道啥叫“剛體”吧,就是不會產生形變的理想物體,平移當然不會改變二維圖形的形狀。同理,下面的“旋轉變換”也是剛體變換,而“縮放”、“錯切”都是會改變圖形形狀的。)

2.public static AffineTransform getScaleInstance(double sx, double sy)

縮放變換,將每一點的橫座標放大(縮小)至sx倍,縱座標放大(縮小)至sy倍,變換矩陣爲:

[   sx   0    0   ]

[   0    sy   0   ]

[   0    0    1   ]

3.public static AffineTransform getShearInstance(double shx, double shy)

剪切變換,變換矩陣爲:

[   1   shx   0   ]

[  shy   1    0   ]

[   0    0    1   ]

相當於一個橫向剪切與一個縱向剪切的複合

[   1      0    0   ][   1   shx   0   ]

[  shy    1    0   ][   0     1   0  ]

[   0      0    1   ][   0     0    1  ]

(譯註:“剪切變換”又稱“錯切變換”,指的是類似於四邊形不穩定性那種性質,街邊小商店那種鐵拉門都見過吧?想象一下上面鐵條構成的菱形拉動的過程,那就是“錯切”的過程。)

4.public static AffineTransform getRotateInstance(double theta)

旋轉變換,目標圖形圍繞原點順時針旋轉theta弧度,變換矩陣爲:

[   cos(theta)    -sin(theta)    0   ]

[   sin(theta)     cos(theta)    0   ]

[       0           0            1   ]

5.public static AffineTransform getRotateInstance(double theta, double x, double y)

旋轉變換,目標圖形以(x, y)爲軸心順時針旋轉theta弧度,變換矩陣爲:

[   cos(theta)    -sin(theta)    x-x*cos+y*sin]

[   sin(theta)     cos(theta)    y-x*sin-y*cos ]

[       0              0          1            ]

相當於兩次平移變換與一次原點旋轉變換的複合:

[1  0  -x][cos(theta)  -sin(theta)  0][1  0  x]

[0  1  -y][sin(theta)   cos(theta)  0][0  1  y]

[0  0  1 ][   0           0        1 ][0  0  1]

發佈了64 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章