计算机原理/仿射变换
前言
2023年08月05日开始起稿。
在 css 中矩阵的变换与 transform 中的 translate、scale、rotate、skew 属性息息相关,彼此符合计算为 matrix 以此实现位移、缩放、旋转、倾斜等视觉效果。
基础运算
点积
点积
叉积
笛卡尔坐标
Cartesian coordinate,正交坐标系。
欧几里得空间
齐次坐标系
Homogencous coordinate 由德国数学家 August Ferdinand Möbius 提出,采用 N+1 维来表示 N 维坐标。
欧几里得空间/笛卡尔空间与齐次坐标转换
基本变换
通用公式
转换矩阵 * 原齐次坐标 = 转换后齐次坐标。即,
假设 。其中,A 为 的 m 行 n 列矩阵,B 为 列的矩阵。B 拆分为列向量,并且列向量的维数就是矩阵的行数。
二维转换方法
transform(a, b, c, d, e, f) 与 Matrix 的转换。这里需要注意的是两者的对应关系为纵向。
- a [线性变换]: 表示为 x 方向的缩放因子,也常用 sx 标识;
- b [线性变换]: 表示为 y 方向的倾斜因子或旋转角度正弦值,这也说明倾斜与旋转之间会有冲突需要处理;
- c [线性变换]: 表示为 x 方向的倾斜因子或旋转角度正弦值;
- d [线性变换]: 表示为 y 方向的缩放因子,也常用 sy 标识;
- e [平移变换]: 表示为 x 方向平移值, 也用 tx 标识;
- f [平移变换]: 表示为 y 方向平移值, 也用 ty 标识。
- g [透视变换]:
- h [透视变换]:
并以此可推导出来
简化后
matrix3d 三维转换方法
平移(Translation)

简化公式为,。
平移逆矩阵
二维平移
在二维空间里面平移需要进行矩阵加法。假设现有点 平移至点 ,平移距离为 X 轴距离偏移 e、Y 轴距离偏移 f,计算如下:
推导矩阵
旋转(Rotation)
四元数
欧拉角
简述
在语言计算中 ,与数学表示法如 不同的是,需要将弧度和角度进行转换,之后代入数学函数计算出结果值。
定义 为弧度,并定义 为角度。则 值为
如在前端 javascript 中进行计算 则为
// 定义角度为 theta
const theta = 30;
// 定义弧度 phi
const phi = Math.PI / 180 * theta;
// 数学函数计算 sin 值
Math.sin(phi)
推导出来
简化公式为,。
旋转逆矩阵
假设
假设存在点 E 移动至点 F。设 E 坐标为(x1, y1),F 坐标为(x2, y2),D 坐标为(a, b)。
简要图示:

初中数学:
演算:
推导:
点旋转的角度 是正旋转还是负旋转,当角度是负旋转时 。
验证:
转换为矩阵:
rotate
从 css 语法上开始转换
.box {
transform: rotate(30deg);
}
这个旋转套用公式
等价于
.box {
transform: matrix(0.86, 0.5, -0.5, 0.86, 0, 0);
}

定点旋转
围绕特定枢轴点 旋转角度 。。
变换矩阵为:
缩放(Scale)
在叙述之前先复习一下二维空间中的向量相关表达式,比如向量的长度计算(勾股定理),定义 x 轴、y 轴方向相同的两个单位向量 u,v 作为一组基底。

单位向量 u,v(依据维基阐述:“一个非零向量的正规化向量就是平行于的单位向量[1]”。求一个方向上给定向量的单位向量即为正规化[Normalization]向量。)的表述法为:
并且标准单位向量
勾股定理推导向量 AC 的模 的值。
扩展到三维。

扩展到多维。多维向量的表示法为 。
推导出。
总结。
推导出在二维坐标系中 X、Y 两个方向的单位向量,使用 i、j、k 进行表示。
三维坐标系中 X、Y、Z 三个方向的单位向量。
推导出来
简化公式为,。
缩放逆矩阵
scale
.box {
transform: scale(0.3, 0.6);
}
通过公式计算
等价于
.box {
// transform: matrix(a, b, c, d, e, f);
transform: matrix(0.3, 0, 0, 0.6, 0, 0);
}

定点缩放
通过前文已知缩放由矩阵转为 matrix 后,其格式为 ,这是基于原点 的情况,如果是围绕特定枢轴点 进行缩放,则是 ,也就是
偏斜/错切(Skew)
倾斜矩阵(错切矩阵)指定沿某一轴线发生 度的倾斜变换。即,。
| 沿 x 轴倾斜 | 沿 y 轴倾斜 |
|---|---|
复合
复合也被称之为累积变换。复合需要注意运算顺序,即旋转、缩放、偏移。所以复合公式的矩阵计算也遵循这个顺序。具体计算仍要根据需求进行组合,不同复合矩阵相乘的结果说不同的。
这里用 css 中的 transform 举例,当我有一个元素节点需要进行旋转和缩放时,rotate 与 scale 等几个基础的转换函数的顺序最终会转化为如下图示。
{{#mermaid:flowchart LR translate --> scale --> rotate }}
举例。
.box {
transform: rotate(30deg) scale(0.3, 0.6);
}
组合需要进行矩阵乘法计算
等价于
.box {
transform: matrix(0.258, 0.15, -0.3, 0.516, 0, 0);
}
复合顺序
累积矩阵不满足乘法的交换律(但具有结合律、分配律特质),所以累积顺序差异(列矩阵从右向左运算)会计算出不同的结果。论证顺序不同结果不同如下:
先旋转再平移简化公式为,。
先平移再旋转简化公式为,。
推导出结果 ,以此可以看出累积顺序的值的区别。
变换矩阵
变换矩阵允许原坐标点通过变换获取新坐标点,新坐标点 与原坐标点 的公式转换如下:
法线变换
CSS
translation, rotation, scaling, skewing
其他
组件库 ml-matrix、gl-matrix
附件

- ↑ 单位向量[OL],2010:10-14. https://zh.wikipedia.org/zh-hans/单位向量.