Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

齐次坐标与二维图形基本几何变换的矩阵推导 #1

Open
IWSR opened this issue Nov 6, 2022 · 2 comments
Open

齐次坐标与二维图形基本几何变换的矩阵推导 #1

IWSR opened this issue Nov 6, 2022 · 2 comments

Comments

@IWSR
Copy link
Owner

IWSR commented Nov 6, 2022

齐次坐标与二维图形基本几何变换的矩阵推导

前言

相比三维的变换,二维的推导还是比较简单的。不过原理都差不多

齐次坐标

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。

正如引用中所说,齐次坐标最大的特点在于它的存在可以区分描述 坐标向量

简单的来说,在普通的直角坐标系(或者说笛卡尔坐标系也行)中,(xA, yA) 可以表示点 A,也可以用来表示向量 $\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)

此时线性变换便可作为工具描述变换过程了,引入变换矩阵后,该问题就变成了求解变换矩阵

已知:

$$ \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} $$

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

解得变换矩阵为

$$ \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)

引入变换矩阵

已知:

$$ \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} $$

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

解得变换矩阵为

$$ \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)

引入变换矩阵

已知:

$$ \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} $$

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

解得变换矩阵为

$$ \begin{pmatrix} cosβ & -sinβ & 0 \\ sinβ & cosβ & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

4. 反射

在数学中,反射是把一个物体变换成它的镜像的映射。要反射一个平面图形,需要“镜子”是一条直线(反射轴),对于三维空间中的反射就要使用平面作为镜子。

如果根据引用,那么反射可分为根据 X 轴反射与根据 Y 轴反射,但实际上也存在中心反射(点反射)这一概念

根据 X 轴反射

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

已知:

$$ \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} $$

得:

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

解得变换矩阵:

$$ \begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

根据 Y 轴反射

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

已知:

$$ \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} $$

得:

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

解得变换矩阵:

$$ \begin{pmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

根据 点(p, q)反射

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

已知:

$$ \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} $$

得:

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

解得变换矩阵:

$$ \begin{pmatrix} -1 & 0 & 2p \\ 0 & -1 & 2q \\ 0 & 0 & 1 \end{pmatrix} $$

5. 错切

定义见图,其实就像是图形在某一方向上的扭曲,底下只贴推导过程。需注意的是 α 与 β 范围为 [0, 90°)

image

y轴为依赖轴的错切变换

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

已知:

$$ \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} $$

得:

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

解得变换矩阵:

$$ \begin{pmatrix} 1 & tanα & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

x轴为依赖轴的错切变换

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

已知:

$$ \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} $$

得:

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

解得变换矩阵:

$$ \begin{pmatrix} 1 & 0 & 0 \\ tanβ & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

@Kaier33
Copy link

Kaier33 commented Nov 8, 2022

已知:

$$ \begin{pmatrix} x & y & 1 \end{pmatrix} \begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} = \begin{pmatrix} x + dx & y+ dy & 1 \end{pmatrix} $$

$$ \begin{cases} ax + dy + g = x + dx \\ bx + ey + h = y + dy \\ cx + fy + i = 1 \end{cases} $$

解得变换矩阵为:

$$ \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ dx & dy & 1 \end{pmatrix} $$

已知:

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

得:

$$ \begin{cases} ax + dy + g = x \\ bx + ey + h = y + x.tanβ \\ cx + fy + i = 1 \end{cases} $$

解得变换矩阵:

$$ \begin{pmatrix} 1 & tanβ & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

github 的 markdown 支持 LaTeX的
$ 改为 $$即可

@IWSR
Copy link
Owner Author

IWSR commented Nov 8, 2022

@Kaier33 喔!学到了!谢谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants