源码
//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>
where
Matrix<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
where
M: 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 类型适合在需要进行几何变换的场景中使用,因为它底层使用了矩阵表示,可以方便地与变换操作结合。