一、源碼
這段代碼定義了一個通用的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} ???xxyx0?xyyy0?xy1????
這是一個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變換表示,適用于各種圖形和計算場景。