CGMath实践

在CGMath中实现如下封装:

缩放变换
翻转变换(水平/垂直)
剪切变换
旋转变换
2维点位齐次化
2维向量齐次化
平移变换
求取逆矩阵

假设形状M为面/线图形,存在包围盒

  • 形状M围绕指定点位P的旋转
    • 1.将M沿PO平移
    • 2.将M进行旋转
    • 3.将M沿OP平移
  • 形状M以自身为轴,进行水平/垂直翻转
    • 1.将M的中点平移至点O
    • 2.将M进行水平/垂直翻转
    • 3.将M中点平移回原先的位置

Linear Transforms 线性变换

x=Mx

x=ax+byy=cx+dy

Linear Transforms
Linear Transforms

Scale Matrix 缩放矩阵

[xy]=[sx00sy][xy]{x=sxxy=syy

缩放变换
缩放变换
缩放变换矩阵
缩放变换矩阵

Reflection Matrix 翻转矩阵

沿y轴水平翻转:

[xy]=[-1001][xy]{x=-xy=y

水平翻转变换
水平翻转变换
水平翻转变换矩阵
水平翻转变换矩阵

Shear Matrix 剪切矩阵

[xy]=[1a01][xy]{x=x+ayy=y

剪切变换
剪切变换
剪切变换矩阵
剪切变换矩阵

Rotate Matrix 旋转矩阵

绕原点CCW(逆时针)旋转:

[xy]=[cosθ-sinθsinθcosθ][xy]{x=xcosθ-ysinθy=xsinθ+ycosθ

旋转变换(逆时针)
旋转变换(逆时针)
旋转变换矩阵
旋转变换矩阵
旋转矩阵特性
  • 旋转矩阵的逆等于它的转置
  • 数学上,如果一个矩阵的逆等于它的转置,则称之为 正交矩阵

Homogeneous coordinates 齐次坐标

点位齐次化

ph=[xy1]

向量齐次化
  • 向量具有平移不变性

vh=[uv0]

齐次坐标概念的延展
  • Vector + Vector = Vector
    • 向量相加结果为向量
  • Point - Point = Vector
    • 点位相减结果为向量
  • Point + Vector = Point
    • 点位使用向量移动结果为点位
  • Point + Point = middlePoint
    • 点位相加结果为中点

Transiation Matrix 平移矩阵

[xy1]=[10tx01ty001][xy1]{x=x+txy=y+ty1=1

平移变换
平移变换
平移变换矩阵
平移变换矩阵

Affine Transformations 仿射变换

[xy1]=[abtxcdty001][xy1]{x=ax+by+txy=cx+dy+ty1=1

仿射变换矩阵
仿射变换矩阵

Inverse Transform 逆变换

x=M-1x

矩阵逆变换
矩阵逆变换

Composing Transform 组合变换

图中变换可以分解成几步?
图中变换可以分解成几步?
  • 第一步:绕原点逆时针旋转45°
  • 第二步:沿x轴正方向平移1个单位

如果变换的顺序发生改变,会影响变换结果

变换顺序很重要
变换顺序很重要
多个变换矩阵的合成
多个变换矩阵的合成

Decomposing Complex Transforms 分解复杂变换

实现矩形以左下角为旋转点,逆时针旋转α角度
实现矩形以左下角为旋转点,逆时针旋转α角度

假设左下角为点P(pX, pY);
原点为点O;

  • 第一步:将点P平移至点O
  • 第二步:以O为原点,将图形逆时针旋转α角度
  • 第三步,将点P重新平移回(pX, pY)

M=T(pX,pY)×R(α)×T(-pX,-pY)

[xy1]=[10pX01pY001][cosα-sinα0sinαcosα0001][10-pX01-pY001][xy1]