当前位置: 首页 > 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> 
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,并实现了一些基本功能。我来逐步解释:

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


http://www.mrgr.cn/news/96598.html

相关文章:

  • Verilog HDL 100道面试题及参考答案
  • [7-02-02].第03节:生产经验 - Broker节点服役和退役
  • Nyquist插件基础:打印格式化字符串(LISP语言)
  • python代码实现离散haar小波变换和db4小波变换
  • kubernetes》》k8s》》 kubeadm、kubectl、kubelet 重启pod
  • SkyWalking+Springboot实战
  • 2025国内DevOps新手突围指南:从Gitee零门槛入门到工具链深度对比
  • 虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路
  • 分布式计算Ray框架面试题及参考答案
  • Mac Apple silicon如何指定运行amd64架构的ubuntu Docker?
  • 一个判断A股交易状态的python脚本
  • USB有驱ID卡读卡器C#小程序开发
  • 哈希表 - 两数之和(Map) - JS
  • 【Kubernetes】CentOS 7 安装 Kubernetes 1.30.1
  • HCIA-数据通信datacom认证
  • Qt使用QGraphicsView绘制线路图————附带详细实现代码
  • 【零基础入门unity游戏开发——2D篇】SpriteRenderer精灵渲染器组件
  • UGNX二次开发——截图功能
  • 蓝桥杯专项复习——二分
  • 将 PyTorch Model 用可视化方法浏览 torchview,onxx, netron, summary | 撰写论文 paper