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

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

相关文章:

【学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>…...

0基础入门scrapy 框架,获取豆瓣top250存入mysql

一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名&#xff09; 使用终端运行太麻烦了&#xff0c;而且…...

鸿蒙NEXT小游戏开发:井字棋

1. 引言 井字棋是一款经典的两人对战游戏&#xff0c;简单易懂&#xff0c;适合各个年龄段的玩家。本文将介绍如何使用鸿蒙NEXT框架开发一个井字棋游戏&#xff0c;涵盖游戏逻辑、界面设计及AI对战功能。 2. 开发环境准备 电脑系统&#xff1a;windows 10 开发工具&#xff1a;…...

deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天

一、软件介绍 文末提供下载 deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天&#xff0c;这是一个浏览器扩展&#xff0c;它允许用户公开、私下分享他们的聊天对话&#xff0c;并使用密码或过期链接来增强 Deepseek Web UI。该扩展程序在 Deepseek 界面中添加了一个 “…...

4. 理解Prompt Engineering:如何让模型听懂你的需求

引言:当模型变成“实习生” 想象一下,你新招的实习生总把“帮我写份报告”理解为“做PPT”或“整理数据表”——这正是开发者与大模型对话的日常困境。某金融公司优化提示词后,合同审查准确率从72%飙升至94%。本文将用3个核心法则+5个行业案例,教你用Prompt Engineering让…...

网络编程—网络概念

目录 1 网络分类 1.1 局域网 1.2 广域网 2 常见网络概念 2.1 交换机 2.2 路由器 2.3 集线器 2.4 IP地址 2.5 端口号 2.6 协议 3 网络协议模型 3.1 OSI七层模型 3.2 TCP/IP五层模型 3.3 每层中常见的协议和作用 3.3.1 应用层 3.3.2 传输层 3.3.3 网络层 3.3.4…...

基于Rust与WebAssembly实现高性能前端计算

引言 随着Web应用的复杂性增加&#xff0c;前端开发者经常面临性能瓶颈。传统JavaScript在处理密集型计算任务&#xff08;如大数据处理或实时图像渲染&#xff09;时&#xff0c;往往显得力不从心。而Rust语言凭借其高性能和内存安全特性&#xff0c;结合WebAssembly的接近原生…...

MATLAB 代码学习

1. Cell数组 Cell数组用于存储异构数据&#xff0c;每个元素&#xff08;称为cell&#xff09;可以包含不同类型的数据&#xff08;如数值、字符串、矩阵等&#xff09;。 1.1 创建Cell数组 直接赋值&#xff1a;使用花括号{}定义内容。 students {Alice, 20, [85, 90, 78…...

SELinux

一、selinux技术详解 SELinux 概述 SELinux&#xff0c;即 Security-Enhanced Linux&#xff0c;意为安全强化的 Linux&#xff0c;由美国国家安全局&#xff08;NSA&#xff09;主导开发。开发初衷是防止系统资源被误用。在 Linux 系统中&#xff0c;系统资源的访问均通过程…...

Axios 相关的面试题

在跟着视频教程学习项目的时候使用了axios发送请求&#xff0c;但是只是跟着把代码粘贴上去&#xff0c;一些语法规则根本不太清楚&#xff0c;但是根据之前的博客学习了fetch了之后&#xff0c;一看axios的介绍就明白了。所以就直接展示axios的面试题吧 本文主要内容&#xff…...

Spring Cloud 跨云灾备:如何实现5分钟级区域切换?

引言&#xff1a;云原生时代&#xff0c;区域级故障的致命性与应对 在混合云与多云架构中&#xff0c;单个区域的宕机可能导致全局服务瘫痪&#xff08;如2023年AWS美东区域故障影响超200家金融系统&#xff09;。传统灾备方案依赖手动切换DNS或冷备集群&#xff0c;恢复时间长…...

ES6对函数参数的新设计

ES6 对函数参数进行了新的设计&#xff0c;主要添加了默认参数、不定参数和扩展参数&#xff1a; 不定参数和扩展参数可以认为恰好是相反的两个模式&#xff0c;不定参数是使用数组来表示多个参数&#xff0c;扩展参数则是将多个参数映射到一个数组。 需要注意&#xff1a;不定…...

爬虫【feapder框架】

feapder框架 1、简单介绍 简介 feapder上手简单、功能强大的Python爬虫框架&#xff0c;内置AirSpider、Spider、Task、Spider、BatchSpider四种爬虫解决不同场景的需求支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能更有功能强大的爬虫管理系统feaplat为其提供方…...

python如何提取html中所有的图片链接

在Python中&#xff0c;你可以使用BeautifulSoup库来解析HTML内容&#xff0c;并提取其中所有的图片链接&#xff08;即<img>标签的src属性&#xff09;。以下是一个示例代码&#xff0c;展示了如何做到这一点&#xff1a; 首先&#xff0c;确保你已经安装了BeautifulSo…...

网络协议之系列

网络协议之基础介绍 。 网络协议之清空购物车时都发生了啥&#xff1f; 。...

LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版

LLaMA Factory微调后的大模型Chat对话效果&#xff0c;与该模型使用vLLM推理架构中的对话效果&#xff0c;可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定&#xff1a;有一半是对的&#xff0c;有一半是无关的。 1、未…...

群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)

摘要 鹈鹕优化算法&#xff08;Pelican Optimization Algorithm, POA&#xff09;是一种灵感来自自然界鹈鹕觅食行为的元启发式优化算法。POA 模拟鹈鹕捕食的两个主要阶段&#xff1a;探索阶段和开发阶段。通过模拟鹈鹕追捕猎物的动态行为&#xff0c;该算法在全局探索和局部开…...

代理模式-spring关键设计模式,bean的增强,AOP的实现

以下是一个结合代理模式解决实际问题的Java实现案例&#xff0c;涵盖远程调用、缓存优化、访问控制等场景&#xff0c;包含逐行中文注释&#xff1a; 场景描述 开发一个跨网络的文件查看器&#xff0c;需实现&#xff1a; 远程文件访问&#xff1a;通过代理访问网络文件 缓存…...

前端实现单点登录(SSO)的方案

概念&#xff1a;单点登录&#xff08;Single Sign-On, SSO&#xff09;主要是在多个系统、多个浏览器或多个标签页之间共享登录状态&#xff0c;保证用户只需登录一次&#xff0c;就能访问多个关联应用&#xff0c;而不需要重复登录。 &#x1f4a1; 方案分类 1. 前端级别 SS…...

在 Blazor 中使用 Chart.js 快速创建数据可视化图表

前言 BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库&#xff08;支持Blazor WebAssembly和Blazor Server两种模式&#xff09;&#xff0c;它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中…...

SQL server 2022和SSMS的使用案例1

一&#xff0c;案例讲解 二&#xff0c;实战讲解 实战环境 你需要确保你已经安装完成SQL Server 2022 和SSMS 20.2 管理面板。点此跳转至安装教程 SQL Server2022Windows11 专业工作站SSMS20.2 1&#xff0c;连接数据库 打开SSMS&#xff0c;连接数据库。 正常连接示意图&…...

【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)

解锁O(log n)高效查询的链表奇迹&#xff01;今日深入解析跳表的数据结构设计与实现细节&#xff0c;从基础概念到Redis级优化策略&#xff0c;彻底掌握这一平衡树的优雅替代方案。 一、跳表核心思想 跳表&#xff08;Skip List&#xff09; 是一种基于多层有序链表的概率型数…...

前沿科技:3D生成领域技术与应用分析

以下是关于3D生成领域的详细分析,涵盖技术发展、应用场景、挑战与未来趋势、市场动态及典型案例: 一、技术发展与核心方法 3D表示方法 显式表示:包括点云、网格(三角形或四边形)和分层深度图像(LDI),适合直接操作和渲染,但细节复杂度高。 隐式表示:如神经辐射场(NeR…...

Spring Boot 3.4.3 基于 JSqlParser 和 MyBatis 实现自定义数据权限

前言 在企业级应用中,数据权限控制是保证数据安全的重要环节。本文将详细介绍如何在 Spring Boot 3.4.3 项目中结合 JSqlParser 和 MyBatis 实现灵活的数据权限控制,通过动态 SQL 改写实现多租户、部门隔离等常见数据权限需求。 一、环境准备 确保开发环境满足以下要求: …...

GO语言学习(14)GO并发编程

目录 &#x1f308;前言 1.goroutine&#x1f31f; 2.GMP模型&#x1f31f; 2.1 GMP的由来☀️ 2.2 什么是GMP☀️ 3.channel &#x1f31f; 3.1 通道声明与数据传输&#x1f4a5; 3.2 通道关闭 &#x1f4a5; 3.3 通道遍历 &#x1f4a5; 3.4 Select语句 &#x1f4…...

【Audio开发二】Android原生音量曲线调整说明

一&#xff0c;客制化需求 客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。 二&#xff0c;音量曲线调试流程 Android根据不同的音频流类型定义不同的曲线&#xff0c;曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volu…...

sass报错,忽略 Sass 弃用警告,降级版本

最有效的方法是创建一个 .sassrc.json 文件来配置 Sass 编译器。告诉 Sass 编译器忽略来自依赖项的警告消息。 解决方案&#xff1a; 1. 在项目根目录创建 .sassrc.json 文件&#xff1a; {"quietDeps": true }这个配置会让 Sass 编译器忽略所有来自依赖项&#x…...

spring-security原理与应用系列:HttpSecurity.filters

目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列&#xff1a;securityFilterChainBuilders》中&#xff0c;我们遗留了一个问题&…...

JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前五篇文章中&#xff0c;我们深入探讨了JVM生产环境问题定位与解决的实战技巧&#xff0c;从基础的jps、jmap、jstat、jstack、jcmd等工具&#xff0c;到JConsole、VisualVM、MAT的…...

数据仓库项目启动与管理

数据仓库项目启动与管理 确定项目 评估项目就绪情况 项目就绪的三个条件 强力型高级业务管理发起人 对数据仓库解决方案的影响有先见之明是所在组织内有影响的领导者要求严格,但是又比较现实,会为其他成员提供强力支持 强制型业务动机 数据仓库系统和战略性业务动机紧密结合…...