【unitrix】 4.12 通用2D仿射变换矩阵(matrix/types.rs)

发布于:2025-07-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、源码

这段代码定义了一个通用的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的齐次坐标矩阵,用于表示二维空间中的各种线性变换。

四、特性

  1. 支持多种变换:
  • 平移(通过x, y分量)

  • 旋转/缩放/剪切(通过xx, xy, yx, yy分量)

  1. 泛型设计:
  • 支持不同类型的分量值

  • 类型安全,编译时检查

  1. 轻量级:
  • 所有字段只需实现Copy trait

  • 结构体本身也实现了Copy

  1. 可组合性:
  • 可以通过矩阵乘法组合多个变换

五、应用场景

  1. 平面几何转换(平移/旋转/缩放/剪切)

  2. 颜色空间线性变换(如RGB到YUV转换)

  3. 带物理单位的量值转换(如像素到毫米的映射)

  4. 动画系统中的插值变换

六、构造函数


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变换表示,适用于各种图形和计算场景。


网站公告

今日签到

点亮在社区的每一天
去签到