一、源码
这段代码定义了一个通用的2D仿射变换矩阵结构,可用于表示二维空间中的各种线性变换。
/// 通用2D仿射变换矩阵(元素仅需实现Copy trait)
///
/// 该矩阵可用于表示二维空间中的任意仿射变换,支持以下应用场景:
/// 1. 平面几何转换(平移/旋转/缩放/剪切)
/// 2. 颜色空间线性变换(如RGB到YUV转换)
/// 3. 带物理单位的量值转换(如像素到毫米的映射)
/// 4. 动画系统中的插值变换
///
/// 矩阵数学表示:
/// ┌ ┐
/// │ xx xy x │
/// │ yx yy y │
/// │ 0 0 1 │
/// └ ┘
///
/// 字段说明:
/// - x, y: 平移分量(translation),支持:
/// * 基本标量(f32/f64)
/// * 带单位的量(如Length<T>)
/// * 动态变量(Var<T>)
///
/// - xx, xy, yx, yy: 线性变换分量,支持:
/// * 类型常量(编译时确定的转换因子)
/// * 运行时变量(通过Var<T>包装)
/// * 单位化量(如角度、比例系数等)
///
/// 特性:
/// - 轻量:所有字段只需实现Copy trait
/// - 类型安全:支持泛型参数指定不同计算精度
/// - 可组合:可通过矩阵乘法组合多个变换
///
/// 示例:
/// ```
/// // 创建平移矩阵
/// let translate = Matrix::new(10.0, 20.0, 1.0, 0.0, 0.0, 1.0);
///
/// // 创建缩放矩阵
/// let scale = Matrix::new(0.0, 0.0, 2.0, 0.0, 0.0, 3.0);
///
/// // 组合变换(先缩放后平移)
/// let transform = translate * scale;
/// ```
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {
/// 水平平移分量
pub x: X,
/// 垂直平移分量
pub y: Y,
/// 水平轴向缩放和X到X的变换因子
pub xx: Xx,
/// X到Y轴的剪切/旋转因子
pub xy: Xy,
/// Y到X轴的剪切/旋转因子
pub yx: Yx,
/// 垂直轴向缩放和Y到Y的变换因子
pub yy: Yy,
}
impl<X, Y, Xx, Xy, Yx, Yy> Matrix<X, Y, Xx, Xy, Yx, Yy> {
/// 构造一个新的2D仿射变换矩阵
///
/// # 参数
/// - `x`: 水平平移分量
/// - `y`: 垂直平移分量
/// - `xx`: X轴缩放和X到X变换因子
/// - `xy`: X到Y轴的剪切/旋转因子
/// - `yx`: Y到X轴的剪切/旋转因子
/// - `yy`: Y轴缩放和Y到Y变换因子
///
/// # 返回值
/// 返回构建的2D仿射变换矩阵
///
/// # 示例
/// ```
/// let identity = Matrix::new(0.0, 0.0, 1.0, 0.0, 0.0, 1.0); // 单位矩阵
/// let translated = Matrix::new(10.0, 20.0, 1.0, 0.0, 0.0, 1.0); // 平移矩阵
/// ```
pub fn new(x: X, y: Y, xx: Xx, xy: Xy, yx: Yx, yy: Yy) -> Self {
Self { x, y, xx, xy, yx, yy }
}
}
二、结构体定义
pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {
pub x: X, // 水平平移分量
pub y: Y, // 垂直平移分量
pub xx: Xx, // X轴缩放和X到X变换因子
pub xy: Xy, // X到Y轴的剪切/旋转因子
pub yx: Yx, // Y到X轴的剪切/旋转因子
pub yy: Yy // Y轴缩放和Y到Y变换因子
}
这是一个泛型结构体,使用6个类型参数分别表示矩阵的不同分量。这种设计使得矩阵可以支持不同类型的值(如f32/f64、带单位的量、动态变量等)。
三、数学表示
矩阵表示2D仿射变换,数学形式为:
[ x x x y x y x y y y 0 0 1 ] \begin{bmatrix}xx & xy & x \\ yx & yy & y \\ 0 & 0 & 1 \end{bmatrix} ⎣⎡xxyx0xyyy0xy1⎦⎤
这是一个3x3的齐次坐标矩阵,用于表示二维空间中的各种线性变换。
四、特性
- 支持多种变换:
平移(通过x, y分量)
旋转/缩放/剪切(通过xx, xy, yx, yy分量)
- 泛型设计:
支持不同类型的分量值
类型安全,编译时检查
- 轻量级:
所有字段只需实现Copy trait
结构体本身也实现了Copy
- 可组合性:
- 可以通过矩阵乘法组合多个变换
五、应用场景
平面几何转换(平移/旋转/缩放/剪切)
颜色空间线性变换(如RGB到YUV转换)
带物理单位的量值转换(如像素到毫米的映射)
动画系统中的插值变换
六、构造函数
pub fn new(x: X, y: Y, xx: Xx, xy: Xy, yx: Yx, yy: Yy) -> Self
创建一个新的2D仿射变换矩阵,参数对应矩阵的各个分量。
七、示例用法
// 创建平移矩阵
let translate = Matrix::new(10.0, 20.0, 1.0, 0.0, 0.0, 1.0);
// 创建缩放矩阵
let scale = Matrix::new(0.0, 0.0, 2.0, 0.0, 0.0, 3.0);
// 组合变换(先缩放后平移)
let transform = translate * scale;
这个设计提供了灵活且类型安全的2D变换表示,适用于各种图形和计算场景。