【学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.mzph.cn/pingmian/75291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《AI大模型应知应会100篇》第7篇:Prompt Engineering基础:如何与大模型有效沟通

第7篇&#xff1a;Prompt Engineering基础&#xff1a;如何与大模型有效沟通 摘要 Prompt Engineering&#xff08;提示工程&#xff09;是与大模型高效沟通的关键技能。通过精心设计的Prompt&#xff0c;可以让模型生成更准确、更有用的结果。本文将从基础知识到高级策略&…

Java高频面试题1:Java SE

一、Java概述 1. Java语言的特点&#xff1f; 面向对象&#xff1a;封装、继承、多态。跨平台&#xff1a;通过JVM实现“一次编写&#xff0c;到处运行”。内存管理&#xff1a;自动垃圾回收&#xff08;GC&#xff09;&#xff0c;避免手动内存管理。多线程&#xff1a;内置…

基于RapidIO接口的DSP+GPU工业AI实时计算解决方案

基于RapidIO接口的DSPGPU工业AI实时计算解决方案是一种面向高性能、低延迟工业应用的异构计算架构&#xff0c;适用于工业自动化、机器视觉、预测性维护、机器人控制等场景。以下是该方案的核心设计思路和技术要点&#xff1a; 1. 方案背景与目标 工业需求&#xff1a; 工业…

SQL DB 数据类型

SQL DB 数据类型 引言 在数据库管理系统中,数据类型是定义和存储数据的方式。SQL(结构化查询语言)数据库中的数据类型决定了数据的存储格式、大小、取值范围以及如何处理数据。合理选择和使用数据类型对于确保数据库性能、数据完整性和应用程序的准确性至关重要。 SQL 数…

常见电源模块设计

目录 1. 5V电源模块 2. 3.3V电源模块 3. 1.9V电源模块 4. 220V转12V电源模块 1. 5V电源模块 参考电路 电路说明&#xff1a; 这个电路采用的是稳压芯片78L05&#xff0c;我是用的12V的电源模块转成为5V,为后续的供电。 2. 3.3V电源模块 参考电路&#xff1a; 电路说明…

python操作es

1、常用操作 ### 创建索引 bash curl -u elastic:123 -X PUT -H "Content-Type: application/json" -d mapping.json "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index" ### 删除索引 bash curl -u elastic:123 -X DELETE "http://0.0…

记一个.NET AOT交叉编译时的坑

记一个.NET AOT交叉编译时的坑 背景&#xff1a; 使用.NET9开发的Avalonia项目需要部署到Linux-arm64 踩坑&#xff1a; 根据官方AOT交叉编译文档配置后执行打包 dotnet publish -r linux-arm64提示error : The PrivateSdkAssemblies ItemGroup is required for _ComputeA…

【Linux篇】探索进程地址空间:计算机背后的虚拟世界

进程地址空间的奥秘&#xff1a;让你理解程序如何在计算机中生存 一. 程序地址空间1.1 基本概念1.2 虚拟内存管理1.3 为什么存在虚拟地址空间1.3.1 意义 2. 最后 本文将介绍进程地址空间的基本概念与结构&#xff0c;帮助读者理解操作系统如何管理和分配内存。进程地址空间指的…

17查询文档的方式

目录 1.鼠标放在你要查询的地方或者选中&#xff0c;按FnF1 2Assistant文档 3帮助菜单界面 1.鼠标放在你要查询的地方或者选中&#xff0c;按FnF1 2Assistant文档 3帮助菜单界面 大家一定要有 查询文档 的意识!! 未来实际开发中,一定会用到很多的第三方库和框架的. 很可能用到的…

壹起航:引领中国工厂迈向全球市场的先锋

在全球化的浪潮中&#xff0c;中国工厂正积极寻求拓展海外市场的新机遇。面对激烈的国际竞争&#xff0c;如何脱颖而出&#xff0c;成为行业翘楚&#xff1f;壹起航凭借其深厚的行业积淀和创新的营销理念&#xff0c;为中国工厂提供了全方位的出海解决方案。 一、构建国际化外…

“数据导航仪”:企业迁移知识库如何赋能精准决策

在全球化与区域经济一体化的浪潮下&#xff0c;企业迁移已成为经济发展的重要现象。 无论是为了拓展市场、降低成本&#xff0c;还是为了寻找更好的政策环境&#xff0c;企业迁移都牵动着无数从业者的心。 然而&#xff0c;面对海量且分散的企业迁移信息&#xff0c;金融机构…

理解激活函数,多个网络层之间如何连接

1. 激活函数如何在两个层之间作用 如果不在两个层之间添加激活函数&#xff0c;模型将无法学习非线性关系&#xff0c;表现出像线性模型一样的局限性。 LeakyReLU(0.2) 是一个激活函数&#xff0c;它的作用是对每一层的输出进行非线性转换。激活函数通常在神经网络中用于增加网…

红帽Linux怎么重置密码

完整流程 ●重启操作系统&#xff0c;进入启动界面 ●然后按进入选择项界面 ●找到linux单词开头的那一行&#xff0c;然后移动到该行末尾&#xff08;方向键移动或者使用键盘上的end&#xff09;&#xff0c;在末尾加入rd.break ●按ctrl x进入rd.break模式 ●在该模式下依次…

pycharm与python版本

python 3.6-3.9 pycharm 2021版本搭配最好 python 3.8 pycharm 2019版本搭配最好 pycharm各版本下载

Java系统集成AI大模型:是否需要训练模型及实现路径

越来越多的Java系统希望通过集成AI大模型能力来提升智能化水平。然而&#xff0c;许多开发者在面对这一任务时&#xff0c;常常会有一个疑问&#xff1a;是否需要训练AI大模型才能实现这一目标&#xff1f;本文将深入探讨这一问题&#xff0c;并提供详细的解决方案。 一、是否…

论文阅读笔记:Denoising Diffusion Implicit Models (3)

0、快速访问 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08…

【Linux】Linux 系统启动流程详解

1. BIOS/UEFI 阶段 硬件自检&#xff08;POST&#xff09; BIOS/UEFI 执行硬件检查&#xff08;内存、CPU、外设等&#xff09;。若硬件异常&#xff0c;通过蜂鸣码或屏幕提示错误。 选择启动设备 按配置顺序&#xff08;硬盘、U盘、网络等&#xff09;寻找可引导设备。BIOS&a…

C++封装、继承、多态(虚函数)

目录 1、封装 2、继承 继承方式&#xff1a; &#xff08;1&#xff09;公有继承&#xff1b;public &#xff08;2&#xff09;保护继承&#xff1b;protected &#xff08;3&#xff09;私有继承&#xff1b;private 菱形继承&#xff1a; 同名隐藏&#xff1f; 含义…

蓝桥杯冲刺:一维前缀和

系列文章目录 蓝桥杯系列&#xff1a;一维前缀和 文章目录 系列文章目录前言一、暴力的写法&#xff1a;二、一维前缀和的模板&#xff1a; 具体实现&#xff1a; 三、具体例题&#xff1a;求和 1.题目参考&#xff1a;2.以下是具体代码实现&#xff1a; 总结 前言 上次我介绍…

使用UDP建立连接,会存在什么问题?

使用UDP建立连接&#xff0c;会存在可靠性、有序性、连接状态管理等方面的问题&#xff1a; 1、数据传输不可靠&#xff1a; UDP没有确认和重传机制&#xff0c;发送方发送数据后&#xff0c;不会等待接收方的确认消息。这意味着如果数据在传输过程中丢失&#xff0c;发送方不…