【学Rust写CAD】21 2D 点(point.rs)
源码
//matrix/point.rs
use std::ops::Mul;
use super::algebraic_units::{Zero, One};
use super::generic::Matrix;/// 点坐标结构体
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y> Point<X, Y> {/// 创建新点pub fn new(x: X, y: Y) -> Self {Point(Matrix { x, y, xx: One, xy: Zero, yx: Zero, yy: One })}/// 获取x坐标pub fn x(self) -> X {self.0.x}/// 获取y坐标pub fn y(self) -> Y {self.0.y}
}// 点 * 矩阵
impl<X, Y, M> Mul<M> for Point<X, Y>
whereMatrix<X, Y, One, Zero, Zero, One>: Mul<M>,
{type Output = Point<<Matrix<X, Y, One, Zero, Zero, One> as Mul<M>>::Output>;fn mul(self, rhs: M) -> Self::Output {Point(self.0 * rhs)}
}// 矩阵 * 点
impl<M, X, Y> Mul<Point<X, Y>> for M
whereM: Mul<Matrix<X, Y, One, Zero, Zero, One>>,
{type Output = Point<<M as Mul<Matrix<X, Y, One, Zero, Zero, One>>>::Output>;fn mul(self, rhs: Point<X, Y>) -> Self::Output {Point(self * rhs.0)}
}
代码分析
这段代码定义了一个表示二维点的结构体 Point,并实现了一些基本功能。我来逐步解释:
- 导入和依赖
use std::ops::{Add, Sub, Mul};
use super::algebraic_units::{Zero, One};
use super::generic::Matrix;
-
从标准库导入了加减乘的操作符 trait
-
从父模块导入了表示代数单位元的 Zero 和 One 类型
-
从父模块导入了通用的 Matrix 类型
- Point 结构体定义
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Point<T>(Matrix<T, T, One, Zero, Zero, One>);
-
定义了一个泛型结构体 Point
-
使用了元组结构体的形式,内部包含一个 Matrix 类型
-
为 Point 自动派生了一些 trait:Debug(调试打印)、Clone(克隆)、Copy(拷贝语义)、PartialEq(部分相等比较)
-
Matrix 的泛型参数表示这是一个 2D 变换矩阵,但只使用其平移部分(x, y),旋转和缩放部分固定为单位矩阵
- 实现的方法
impl<T> Point<T> {/// 创建一个新点pub fn new(x: T, y: T) -> Self {Point(Matrix {x,y,xx: One,xy: Zero,yx: Zero,yy: One,})}/// 获取x坐标pub fn x(&self) -> &T {&self.0.x}/// 获取y坐标pub fn y(&self) -> &T {&self.0.y}
}
-
new(x, y):创建一个新点,初始化矩阵的平移部分为 (x,y),其余部分为单位矩阵
-
x():返回 x 坐标的引用
-
y():返回 y 坐标的引用
设计特点
-
使用矩阵来表示点,为了后续方便进行几何变换
-
固定旋转和缩放部分为单位矩阵,确保只表示纯平移
-
泛型设计使得可以支持多种数值类型
-
提供了基本的构造和访问方法
这个 Point 类型适合在需要进行几何变换的场景中使用,因为它底层使用了矩阵表示,可以方便地与变换操作结合。