以下为个人学习笔记整理,涉及坐标内容统一用右手坐标系,课程官网。
# 大小变换(Scale)
各个坐标放大或者缩小
缩放矩阵:[s00s]→[s00s][xy]=[x′y′]
# 翻转(Reflection)
各个坐标取反
翻转矩阵:[−1001]→[−1001][xy]=[x′y′]
# 切变(Shear)
y 坐标不变,x 坐标水平移动,移动距离取决于矩阵右上角的值(ay)
切变矩阵:[10a1]→[10a1][xy]=[x+ayy]=[x′y′]
# 旋转(Rotate)
默认情况下,绕着原点(0,0)逆时针进行旋转
[acbd][01]=[−sinθcosθ]→b=−sinθ,d=cosθ
[acbd][10]=[cosθsinθ]→a=cosθ,c=sinθ
旋转矩阵:[cosθsinθ−sinθcosθ]
任何一个坐标,如果可以通过一个矩阵进行变换得到,那么称之为「线性变换」
x′=Mx→[x′y′]=[acbd][xy]
x′=ax+by
y′=cx+dy
# 齐次坐标(Homogeneous coordinates)
引入「齐次坐标」的目的,是为了解决「平移矩阵」,常规的平移,没用办法通过「线性变换」得到
x′=x+tx
y′=y+ty
[x′y′]=[acbd][xy]+[txty]
tx 和 ty 没办法通过 ax+by 的形式得到,它是一个固定值
# 新增一个 w 坐标维度
为了能够实现平移的效果,又可以让整体计算变得统一,所以引入了一个新的 w 坐标维度。
- 2D 平面内的向量: (x,y,0)T。
- 2D 平面内的点:(x,y,1)T
# 为什么向量的齐次坐标是 (x,y,0)T
- vector + vector = vector
- point - point = vector
- point + vector = point
- point + point = point(这两个点的中点)
向量的第三维是 0,是为了保证平移操作不会影响向量本身的方向和值。
# 为什么点的其次坐标是(x,y,1)T
其实也可以非 1,但是最终都可以转换成为 1 的情况。只要 w 不为 0(为 0 的情况下视作向量)
# 齐次坐标下的平移操作
⎝⎛x′y′w′⎠⎞=⎝⎛100010txty1⎠⎞⎝⎛xy1⎠⎞=⎝⎛x+txy+ty1⎠⎞
# 齐次坐标下的其他操作:
任何仿射变换(Affine Transformations)都可以转换成 齐次坐标变换
仿射变换:(x′y′)=(acbd)(xy)+(txty)
齐次坐标变换:⎝⎛x′y′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⎝⎛xy1⎠⎞
注意,所有的变换都是先处理线性变换 ⋅(x,y)T,再处理平移 +(tx,ty)T
# Scale
缩放:S(sx,sy)=⎝⎛sx000sy0001⎠⎞
# Rotation
旋转:R(α)=⎝⎛cosαsinα0−sinαcosα0001⎠⎞
旋转:R(−α)=⎝⎛cosα−sinα0sinαcosα0001⎠⎞
R(α)T=R(−α)
# Translation
平移:T(tx,ty)=⎝⎛100010txty1⎠⎞
# 多次变换的情况下:
操作顺序从右到左依次进行。
先旋转45度后,再平移1个单位:T(1,0)⋅R45⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡100010101⎦⎥⎤⎣⎢⎡cos45∘sin45∘0−sin45∘cos45∘0001⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤
# 如何围绕某个点进行旋转?
可以看成是先对图像进行平移,在进行旋转,再进行平移
T(c)⋅R(α)⋅T(−c)
# 关键字