banner
IWSR

IWSR

美少女爱好者,我永远喜欢芳泽瑾。另外 P5 天下第一!

齊次坐標與二維圖形基本幾何變換的矩陣推導

齊次坐標#

“齊次坐標表示是計算機圖形學的重要手段之一,它既能夠用來明確區分向量和點,同時也更易於進行仿射(線性)幾何變換。”—— F.S. Hill, JR。

正如引用中所說,齊次坐標最大的特點在於它的存在可以區分描述 坐標向量

簡單的說,在普通的直角坐標系(或者說笛卡爾坐標系也行)中,(xA, yA) 可以表示點 A,也可以用來表示向量 oA\vec{oA}。這種含糊不清的表述方式並不利於準確的抽象描述給計算機。

而齊次坐標通過將 n 維提升到 n+1 維從而解決了這個問題。

我們可以在一個 2D 笛卡爾坐標末尾加上一個額外的變量 w 來形成 2D 齊次坐標,因此,一個點 (X,Y) 在齊次坐標裡面變成了(x,y,w),並且有

X = x/w

Y = y/w

如在齊次坐標中

  • 描述一個點 A,其表示為 (xA, yA, 1)
  • 描述一個向量 $\vec {oA}$,其表示為 (xA, yA, 0)

試著將 w=1,0 帶入 x/w,便可以理解為何 1 表示點(位置)、0 表示向量(方向)了。

除此之外也方便進行向量加法之類的操作

image

當然除了描述向量與點外,齊次坐標的引入也方便描述幾何變換 (線性變換)。

比如如果不用齊次坐標表示的二維平移是下圖這樣的

image

二維圖形基本幾何變換#

二維圖形變換大致分為以下五類 —— 平移(Translate)、縮放(Scale)、旋轉(Rotate)、反射(Reflect)和錯切(shear)

1. 平移#

描述從點 (x, y) 到 (x + dx, y+ dy)

引入齊次坐標,可表述為 (x, y, 1) 變形推導為 (x + dx, y+ dy, 1)

此時線性變換便可作為工具描述變換過程了,引入變換矩陣後,該問題就變成了求解變換矩陣

已知:

(abcdefghi)(xy1)=(x+dxy+dy1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x + dx \\ y+ dy \\ 1 \end{pmatrix}

{ax+by+c=x+dxdx+ey+f=y+dygx+hy+i=1\begin{cases} ax + by + c = x + dx \\ dx + ey + f = y + dy \\ gx + hy + i = 1 \end{cases}

解得變換矩陣為

(10dx01dy001)\begin{pmatrix} 1 & 0 & dx \\ 0 & 1 & dy \\ 0 & 0 & 1 \end{pmatrix}

於是在數學層面我們就可以用這個變換矩陣來描述平移過程了。

2. 縮放#

描述從點 (x, y) 到 (sx*x, sy*y),sx 與 sy 為常量。

引入齊次坐標,可表述為 (x, y, 1) 變形推導為 (sx*x, sy*y, 1)

引入變換矩陣

已知:

(abcdefghi)(xy1)=(sxxsyy1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} sx * x \\ sy * y \\ 1 \end{pmatrix}

{ax+by+c=sxxdx+ey+f=syygx+hy+i=1\begin{cases} ax + by + c = sx * x \\ dx + ey + f = sy * y \\ gx + hy + i = 1 \end{cases}

解得變換矩陣為

(sx000sy0001)\begin{pmatrix} sx & 0 & 0 \\ 0 & sy & 0 \\ 0 & 0 & 1 \end{pmatrix}

3. 旋轉#

解釋旋轉需要引入單位圓。

image

如圖,點 B 旋轉至 點 C 處,AB 與 X 軸的夾角為 α,AC 與 AB 夾角為 β

則 B 點坐標可表示為 (cosα, sinα),C 點坐標為 (cos (α + β), sin (α + β))

將 C 點坐標展開,則 C 點為 (cosα cosβ - sinα sinβ, sinα cosβ + cosα sinβ)

記 B 點坐標為 (x, y),C 點坐標則為 (x cosβ - y sinβ, y cosβ + x sinβ)

引入齊次坐標,可表述為 (x, y, 1) 變形推導為 (x cosβ - y sinβ, y cosβ + x sinβ, 1)

引入變換矩陣

已知:

(abcdefghi)(xy1)=(xcosβysinβycosβ+xsinβ1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} xcosβ - ysinβ \\ ycosβ + xsinβ \\ 1 \end{pmatrix}

{ax+by+c=xcosβysinβdx+ey+f=ycosβ+xsinβgx+hy+i=1\begin{cases} ax + by + c = xcosβ - ysinβ \\ dx + ey + f = ycosβ + xsinβ \\ gx + hy + i = 1 \end{cases}

解得變換矩陣為

(cosβsinβ0sinβcosβ0001)\begin{pmatrix} cosβ & -sinβ & 0 \\ sinβ & cosβ & 0 \\ 0 & 0 & 1 \end{pmatrix}

4. 反射#

在數學中,反射是把一個物體變換成它的鏡像的映射。要反射一個平面圖形,需要 “鏡子” 是一條直線(反射軸),對於三維空間中的反射就要使用平面作為鏡子。

如果根據引用,那麼反射可分為根據 X 軸反射與根據 Y 軸反射,但實際上也存在中心反射(點反射)這一概念

根據 X 軸反射#

描述點 (x, y) 到點 (x, -y)

已知:

(abcdefghi)(xy1)=(xy1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x \\ -y \\ 1 \end{pmatrix}

得:

{ax+by+c=xdx+ey+f=ygx+hy+i=1\begin{cases} ax + by + c = x \\ dx + ey + f = -y \\ gx + hy + i = 1 \end{cases}

解得變換矩陣:

(100010001)\begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{pmatrix}

根據 Y 軸反射#

描述點 (x, y) 到點 (-x, y)

已知:

(abcdefghi)(xy1)=(xy1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} -x \\ y \\ 1 \end{pmatrix}

得:

{ax+by+c=xdx+ey+f=ygx+hy+i=1\begin{cases} ax + by + c = -x \\ dx + ey + f = y \\ gx + hy + i = 1 \end{cases}

解得變換矩陣:

(100010001)\begin{pmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}

根據 點 (p, q) 反射#

描述點 (x, y) 到點 (2p-x, 2q-y)

已知:

(abcdefghi)(xy1)=(2px2qy1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} 2p-x \\ 2q-y \\ 1 \end{pmatrix}

得:

{ax+by+c=2pxdx+ey+f=2qygx+hy+i=1\begin{cases} ax + by + c = 2p-x \\ dx + ey + f = 2q-y \\ gx + hy + i = 1 \end{cases}

解得變換矩陣:

(102p012q001)\begin{pmatrix} -1 & 0 & 2p \\ 0 & -1 & 2q \\ 0 & 0 & 1 \end{pmatrix}

5. 錯切#

定義見圖,其實就像是圖形在某一方向上的扭曲,底下只貼推導過程。需注意的是 α 與 β 範圍為 [0, 90°)

image

y 軸為依賴軸的錯切變換#

描述點 (x, y) 到點 (x + y.tanα, y)

已知:

(abcdefghi)(xy1)=(x+y.tanαy1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x+y.tanα \\ y \\ 1 \end{pmatrix}

得:

{ax+by+c=x+y.tanαdx+ey+f=ygx+hy+i=1\begin{cases} ax + by + c = x+y.tanα \\ dx + ey + f = y \\ gx + hy + i = 1 \end{cases}

解得變換矩陣:

(1tanα0010001)\begin{pmatrix} 1 & tanα & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}

x 軸為依賴軸的錯切變換#

描述點 (x, y) 到點 (x, y + x.tanβ)

已知:

(abcdefghi)(xy1)=(xy+x.tanβ1)\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x \\ y + x.tanβ \\ 1 \end{pmatrix}

得:

{ax+by+c=xdx+ey+f=y+x.tanβgx+hy+i=1\begin{cases} ax + by + c = x \\ dx + ey + f = y + x.tanβ \\ gx + hy + i = 1 \end{cases}

解得變換矩陣:

(100tanβ10001)\begin{pmatrix} 1 & 0 & 0 \\ tanβ & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。