当前位置: 首页 > news >正文

【学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> 
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,并实现了一些基本功能。我来逐步解释:

  1. 导入和依赖
use std::ops::{Add, Sub, Mul};
use super::algebraic_units::{Zero, One};
use super::generic::Matrix;
  • 从标准库导入了加减乘的操作符 trait

  • 从父模块导入了表示代数单位元的 Zero 和 One 类型

  • 从父模块导入了通用的 Matrix 类型

  1. 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),旋转和缩放部分固定为单位矩阵

  1. 实现的方法
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 坐标的引用

设计特点
  1. 使用矩阵来表示点,为了后续方便进行几何变换

  2. 固定旋转和缩放部分为单位矩阵,确保只表示纯平移

  3. 泛型设计使得可以支持多种数值类型

  4. 提供了基本的构造和访问方法

这个 Point 类型适合在需要进行几何变换的场景中使用,因为它底层使用了矩阵表示,可以方便地与变换操作结合。

相关文章:

  • Vue中将pdf文件转为图片
  • LabVIEW永磁同步电机性能测试系统
  • MyBatis--#{}和${}
  • 人脸表情识别数据集的正确使用方法(Affectnet、RAF-DB、FERPlus数据集通用)
  • 树莓派超全系列教程文档--(20)树莓派配置自动息屏
  • VINS-Mono学习(六):回环检测
  • react antd 项目报错Warning: Each child in a list should have a unique “key“prop
  • Python入门(5):异常
  • Dart 实现与蓝牙设备的通信
  • JSON 基础知识(一)
  • 碰一碰发视频系统--基于H5场景开发
  • 【一起来学kubernetes】32、kubectl使用详解
  • 视频分析设备平台EasyCVR安消一体化解决方案,打造社区/园区全面可视化智能安消应用
  • HNSW(Hierarchical Navigable Small World,分层可导航小世界)用来高效搜索高维向量的最近邻
  • JAVA常见的 JVM 参数及其典型默认值
  • CMMI(能力成熟度模型集成)简介
  • 蓝桥复习2(温度开始)
  • 系统思考反馈
  • 写Prompt的技巧和基本原则
  • PyQt6基础_界面控件简单介绍III
  • 广西鹿寨一水文站“倒刺扶手”存安全隐患,官方通报处理情况
  • 气急败坏!20多名台湾艺人被台当局列为“重点核查对象”
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛征稿启事
  • 马上评|清理“滥竽充数者”,为医者正名
  • 公元1058年:柳永词为什么时好时坏?
  • 广东:十年后省级水网主骨架全面建成,与国家骨干网互联互通