二维图形的几何变换
前面我们讲了如何绘制出一个二维图形,还讲了如何给它填充颜色,现在,我们又有了新的问题,如何在屏幕上移动这个图形呢。
二维图形变换与输出
坐标和变换的矩阵表示
想象一下,如果有一个点
(x, y),我们想让它向右上方移动,只需要给 x 和 y
分别乘上对应的偏移量,得到 (s1*x, s2*y)。
计算过程很简单,可以直接列出两个表达式:
那如果我们在第一象限有一个矩形,四个顶点坐标分别是
(0, 0)、(x, 0)、(0, y)、(x, y),现在想向右上方扩大这个图形——只需要移动除了原点
(0, 0) 以外的三个点。
直接套用刚才的平移公式,得到新的四个顶点:(0, 0)、(s1*x, 0)、(0, s2*y)、(s1*x, s2*y)。
这个计算虽然简单,但每次都要逐点列式子,不够规范化。怎么解决呢?
答案是用矩阵。
我们把点表示成列向量
这样,常见的几何操作都可以写入这个变换矩阵中。
缩放——将 x 方向缩放
旋转——绕原点逆时针旋转
更重要的是,这些操作可以叠加——先缩放再旋转,只需把旋转矩阵乘在缩放矩阵的左边,合并成一个变换矩阵,然后用这一个矩阵去乘所有顶点即可:
可见,有了矩阵,我们可以自由便捷地用一个统一的框架处理图形的变换……吗?
现在回到刚才那个矩形。如果不是单纯的”向右上方扩大”,而是整体向右上方平移,同时还要扩大呢?
你会发现一个问题:
- 缩放是线性变换,可以用
矩阵乘法完成 - 平移不是线性变换,写成
x+a是加法,无法塞进的矩阵乘法里
一个操作能矩阵乘、另一个不能——这就是矛盾的根源。为了让平移也能用矩阵乘法表达,我们需要引入齐次坐标。
齐次坐标
齐次坐标是什么?
齐次坐标 = 给普通坐标”多加一个维度”,让所有变换都能用矩阵乘法统一表达。
为什么要搞齐次坐标?
在普通二维坐标下,旋转和缩放可以用
为了统一,我们把坐标和变换矩阵都扩大一维:
这里
引入了齐次坐标后,你会发现刚才困扰我们的平移操作,也能用一次矩阵乘法干净利落地完成:
缩放、旋转、平移——全部统一成了
齐次变换矩阵
如图所示,在列向量体系下,齐次变换矩阵可以划分成四个区域:
| 区域 | 位置 | 作用 | 包含的变换 |
|---|---|---|---|
| 线性变换区 | 左上角 |
负责方向/形状变化 | 旋转、缩放、反射(镜像)、剪切 |
| 平移区 | 右上角 |
控制位置移动 | |
| 透视耦合区 | 左下角 |
控制非欧几里得变换 | 透视投影、部分剪切、特殊变换 |
| 标量 | 右下角 | 保持齐次一致性 | 通常为 |
下面我们来介绍一下常用的齐次变换矩阵:
平移变换矩阵
平移是一种不产生变形而移动物体的刚体变换(rigid-body transformation)。在齐次坐标下,平移变换矩阵为:
推导:平移变换的目标是
乘开后一目了然:第一行
比例变换矩阵
比例变换是指对点
推导:缩放的目标是
一种特殊的整体比例变换也可以利用齐次坐标的
乘开后得到
旋转变换矩阵
旋转变换是指将点绕原点逆时针旋转
因此,绕原点逆时针旋转
应用旋转:
旋转矩阵是正交矩阵:
。顺时针旋转 等价于逆时针旋转 ,即把 的符号取反。
反射变换矩阵
反射变换(也称镜像变换)将图形关于某条对称轴翻转。
关于 x 轴对称:y 坐标取反,x 不变。
关于 y 轴对称:x 坐标取反,y 不变。
关于原点对称:x、y 均取反(等价于旋转 180°)。
关于直线
错切变换矩阵
错切变换(Shear)使图形在一个方向上发生倾斜,但保持面积不变。
沿 x 方向错切:y 不变,x 随 y 线性偏移。参数
沿 y 方向错切:x 不变,y 随 x 线性偏移。
错切变换矩阵的行列式为
,因此它保持面积不变——这是错切与缩放的重要区别。
变换的性质
上面介绍的五种变换——平移、比例、旋转、反射、错切——统称为二维仿射变换(Affine
Transformation)。它们的
仿射变换具有两条核心不变性:
- 平行线不变性:变换前平行的直线,变换后依然平行
- 有限点数目的不变性:
个点变换后依然是 个点,不会合并或新增
平移、比例、旋转、错切和反射等均是二维仿射变换的特例;反过来,任何常用的二维仿射变换总可以表示为这五种变换的复合。
根据是否保持距离和角度,仿射变换可以进一步细分:
| 类型 | 包含的变换 | 性质 |
|---|---|---|
| 二维刚体变换 | 平移 + 旋转 | 保持距离、角度、形状不变 |
| 二维相似变换 | 平移 + 旋转 + 均匀缩放 | 保持角度不变,距离等比例变化 |
| 一般仿射变换 | 上述全部五种 | 仅保持平行性和有限点数 |
总结一下二维几何变换的几条通用性质:
- 直线的中点不变性:线段中点变换后仍是线段中点
- 平行直线不变性:平行线变换后仍然平行
- 相交不变性:相交的直线变换后仍然相交
- 仅包含旋转、平移和反射的变换维持角度和长度不变(刚体变换)
- 比例变换可改变图形的大小和形状(但保持相似性)
- 错切变换引起角度关系改变,导致图形发生倾斜畸变(但不改变面积)
这次的插图来自画师tektober
图片地址:https://www.pixiv.net/artworks/142098121