计算机图形学 - 二维变换



变换意味着通过应用规则将某些图形更改为其他内容。我们可以进行各种类型的变换,例如平移、缩放(放大或缩小)、旋转、剪切等。当变换发生在二维平面上时,称为二维变换。

变换在计算机图形学中起着重要作用,用于重新定位屏幕上的图形并更改其大小或方向。

齐次坐标

为了执行一系列变换,例如先平移后旋转再缩放,我们需要遵循一个顺序过程:

  • 平移坐标;
  • 旋转平移后的坐标;然后
  • 缩放旋转后的坐标以完成复合变换。

为了缩短此过程,我们必须使用3×3变换矩阵而不是2×2变换矩阵。为了将2×2矩阵转换为3×3矩阵,我们必须添加一个额外的虚拟坐标W。

通过这种方式,我们可以用3个数而不是2个数来表示点,这称为齐次坐标系统。在这个系统中,我们可以用矩阵乘法表示所有变换方程。任何笛卡尔点P(X, Y)都可以通过P’ (Xh, Yh, h)转换为齐次坐标。

平移

平移将对象移动到屏幕上的不同位置。可以通过将平移坐标 (tx, ty) 添加到原始坐标 (X, Y) 来平移二维点,从而得到新的坐标 (X’, Y’)。

Translation

从上图可以看出:

X’ = X + tx

Y’ = Y + ty

对 (tx, ty) 称为平移向量或位移向量。上述方程也可以用列向量表示。

$P = \begin{bmatrix}X\\Y\end{bmatrix}$ p' = $\begin{bmatrix}X'\\Y'\end{bmatrix}$T = $\begin{bmatrix}t_{x}\\t_{y}\end{bmatrix}$

我们可以写成:

P’ = P + T

旋转

在旋转中,我们围绕其原点以特定角度 θ(theta)旋转对象。从下图可以看出,点 P(X, Y) 位于距原点距离为 r 的水平 X 坐标的角度 φ 处。

假设您想将其旋转角度 θ。旋转到新的位置后,您将得到一个新的点 P’ (X’, Y’)。

Rotation

使用标准三角函数,点 P(X, Y) 的原始坐标可以表示为:

$X = r \, cos \, \phi ...... (1)$

$Y = r \, sin \, \phi ...... (2)$

同样,我们可以表示点 P’ (X’, Y’) 为:

${x}'= r \: cos \: \left ( \phi \: + \: \theta \right ) = r\: cos \: \phi \: cos \: \theta \: − \: r \: sin \: \phi \: sin \: \theta ....... (3)$

${y}'= r \: sin \: \left ( \phi \: + \: \theta \right ) = r\: cos \: \phi \: sin \: \theta \: + \: r \: sin \: \phi \: cos \: \theta ....... (4)$

将公式 (1) 和 (2) 分别代入 (3) 和 (4),我们将得到

${x}'= x \: cos \: \theta − \: y \: sin \: \theta $

${y}'= x \: sin \: \theta + \: y \: cos \: \theta $

将上述方程表示为矩阵形式:

$$[X' Y'] = [X Y] \begin{bmatrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \end{bmatrix}OR $$

P’ = P . R

其中 R 是旋转矩阵

$$R = \begin{bmatrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \end{bmatrix}$$

旋转角度可以为正也可以为负。

对于正旋转角度,我们可以使用上述旋转矩阵。但是,对于负角度旋转,矩阵将如下所示更改:

$$R = \begin{bmatrix} cos(-\theta) & sin(-\theta) \\ -sin(-\theta) & cos(-\theta) \end{bmatrix}$$

$$=\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \left (\because cos(-\theta ) = cos \theta \; and\; sin(-\theta ) = -sin \theta \right )$$

缩放

要更改对象的大小,可以使用缩放变换。在缩放过程中,您可以扩展或压缩对象的大小。可以通过将对象的原始坐标与缩放因子相乘来实现缩放,以获得所需的结果。

让我们假设原始坐标为 (X, Y),缩放因子为 (SX, SY),产生的坐标为 (X’, Y’)。这可以用下面的数学公式表示:

X' = X . SX Y' = Y . SY

缩放因子 SX、SY 分别沿 X 和 Y 方向缩放对象。上述方程也可以表示为以下矩阵形式:

$$ \begin{bmatrix} X' \\ Y' \end{bmatrix} = \begin{bmatrix} X \\ Y \end{bmatrix} \begin{bmatrix} S_{x} & 0 \\ 0 & S_{y} \end{bmatrix} $$

P’ = P . S

其中 S 是缩放矩阵。缩放过程如下图所示。

Before Scaling After Scaling

如果我们将小于 1 的值提供给缩放因子 S,则可以减小对象的大小。如果我们提供大于 1 的值,则可以增加对象的大小。

反射

反射是原始对象的镜像。换句话说,我们可以说它是 180° 的旋转操作。在反射变换中,对象的大小不会改变。

下图分别显示了关于 X 轴和 Y 轴以及关于原点的反射。

Reflection Reflection Line

剪切

使对象形状倾斜的变换称为剪切变换。有两种剪切变换:X 剪切Y 剪切。一种会移动 X 坐标值,另一种会移动 Y 坐标值。但是,在这两种情况下,只有一个坐标会改变其坐标,而另一个坐标会保留其值。剪切也称为倾斜

X 剪切

X 剪切保留 Y 坐标,并对 X 坐标进行更改,这会导致垂直线向左或向右倾斜,如下图所示。

X-Shear

X 剪切的变换矩阵可以表示为:

$$X_{sh} = \begin{bmatrix} 1& shx & 0\\ 0& 1 & 0\\ 0& 0 & 1 \end{bmatrix}$$

Y' = Y + Shy . X

X’ = X

Y 剪切

Y 剪切保留 X 坐标并更改 Y 坐标,这会导致水平线转换为向上或向下倾斜的线,如下图所示。

Y-Shear

Y 剪切可以用矩阵表示为:

$$Y_{sh} \begin{bmatrix} 1& 0 & 0\\ shy& 1 & 0\\ 0& 0 & 1 \end{bmatrix}$$

X’ = X + Shx . Y

Y’ = Y

复合变换

如果平面 T1 的变换后接着是第二个平面变换 T2,则结果本身可以用单个变换 T 来表示,该变换是按该顺序组合 T1 和 T2 的结果。这写成 T = T1∙T2。

复合变换可以通过连接变换矩阵来实现,以获得组合变换矩阵。

组合矩阵:

[T][X] = [X] [T1] [T2] [T3] [T4] …. [Tn]

其中 [Ti] 是任何组合

  • 平移
  • 缩放
  • 剪切
  • 旋转
  • 反射

变换顺序的变化会导致不同的结果,因为通常矩阵乘法不是累积的,即 [A] . [B] ≠ [B] . [A],以及乘法的顺序。组合变换的基本目的是通过将单个组合变换应用于点来提高效率,而不是一个接一个地应用一系列变换。

例如,要围绕任意点 (Xp, Yp) 旋转对象,我们必须执行三个步骤:

  • 将点 (Xp, Yp) 平移到原点。
  • 围绕原点旋转它。
  • 最后,将旋转中心移回它所属的位置。
广告