【从头写CAD】2 建立项目及角度类

news2024/9/23 21:29:33

文章目录

  • 一、说明
  • 二、操作步骤
  • 三、角度单位
  • 四、源代码
    • 1. mod.rs 内容
    • 2. angle.rs 内容
    • 3. main.rs 补充调试内容
  • 五、运行
    • 1. 运行程序


一、说明

CAD离不开角度数据,目前CAD开源项目多用double类型表示角度。我认为有必要独立出来,让三角函数仅出现该类内,方便管理。以下代码为初版,欢迎跟帖补充。
我使用的是win10 64位系统,vs_buildtools工具 2019版,rust版本 1.80.1。编辑器为Visual Studio Code 1.92.2版本。相关程序的安装需自行百度。


二、操作步骤

(1)、新建项目cad(cmd命令:cargo new cad);
(2)、进入对应目录(cmd命令:cd cad);
(3)打开项目(cmd命令:code .)
命令行信息(4)在项目目录 src子目录下新建目录unit;
(5)unit下新建rust文件 mod.rs和angle.rs;
编辑器中显示内容


三、角度单位

在国际单位制中,角度的单位是弧度,这是衡量角度的标准度量单位。弧度的定义是基于半径的长度与对应的圆心角的比值,它是一个无量纲的数,我用64位实数(f64)保存该值。
此外,角度的单位还可以用度(°)来表示。度是历史上非常流行的单位,现在日常生活和一些工程制图场合中‌仍然用度标记角度。我用get_degree 和 set_degree函数换算弧度与度单位。

四、源代码

1. mod.rs 内容

pub mod angle;

2. angle.rs 内容

/*
* 角度弧度的类rad
** 编制人: $ource
* 修改版次及创建时间:0版完成版(2024年8月14日)
* 修改内容及时间:无
* 待完善问题:未定义梯度(grad)属性,未检查及调整rad到(-π,π)或(0,2π)范围。暂时不需要这些属性.
*/
const PI:f64=std::f64::consts::PI;
use std::ops::{Add, Sub, Mul, Div};

pub const ANGLE0:Angle=Angle{rad:0f64};
pub const ANGLE45:Angle=Angle{rad:PI/4f64};
pub const ANGLE90:Angle=Angle{rad:PI/2f64};
pub const ANGLE180:Angle=Angle{rad:PI};

#[derive(Debug,PartialEq,PartialOrd,Clone,Copy)]
pub struct Angle{
    pub rad:f64,//外部可以访问该变量
}

impl Angle{
    //构造函数(弧度) (x,y)
    pub fn new(rad:f64)->Angle{//建议控制在(-π,π)
        Angle{rad}
    }
    
    pub fn from(x:f64,y:f64)->Angle{//(-π,π)
        Angle{rad:y.atan2(x)}
    }

    //属性 弧度  角度 x  y 单位矢量
    pub fn get_radian(&self)->f64{//结构体内rad变量可以直接使用,该函数可以不用
        self.rad
    }

    pub fn set_radian(& mut self,rad:f64)->(){//结构体内rad变量可以直接使用,该函数可以不用
        self.rad=rad;
    }

    pub fn get_degree(&self)->f64{//转换成度
        self.rad*(180f64/PI)
    }

    pub fn set_degree(&mut self,d:f64)->(){//度转换成弧度后保存
        self.rad=d/(180f64/PI);
    }

    pub fn unit_x(&self)->f64{//角度对应单位向量x值
        self.rad.cos()
    }

    pub fn unit_y(&self)->f64{//角度对应单位向量y值
        self.rad.sin()
    }

    pub fn abs(&self)->Angle{//角度取绝对值
        Angle{rad:self.rad.abs()}
    }
}

//运算符重载 + - * /,实现加减及比例缩放。
//注意:角度参与矩阵乘法计算  角度*角度等同与 角度+角度;同理:角度/角度等同与 角度-角度
impl Add for Angle{//角度加法
    type Output = Self;
    fn add(self, other: Self) ->Angle{
        Self{rad:self.rad + other.rad}
    }
}

impl Sub for Angle{//角度减法
    type Output = Self;
    fn sub(self, other: Self) ->Angle{
        Self{rad:self.rad - other.rad}
    }
}

impl Mul<f64> for Angle{//角度比例缩放
    type Output = Self;
    fn mul(self, scale:f64) -> Angle {
        Angle::new(self.rad * scale)
    }
}

impl Div<f64> for Angle{//角度比例缩放
    type Output = Self;
    fn div(self, scale:f64) -> Angle {
        Angle::new(self.rad / scale)
    }
}

impl Mul<Angle> for Angle{//等同加法
    type Output = Self;
    fn mul(self, other:Self) -> Angle {
        Angle::new(self.rad + other.rad)
    }
}

impl Div<Angle> for Angle{//等同减法
    type Output = Self;
    fn div(self, other:Self) -> Angle {
        Angle::new(self.rad - other.rad)
    }
}

#[cfg(test)]   //cfg 属性负责控制条件编译,并仅会在谓词为 true 时编译其所附带的内容。cargo test 时满足运行条件
mod tests {
    use super::*;//是 angle_test 模块内部代码访问外部模块中 Angle 的必要条件。
    #[test]
    fn angle_test() {
        assert_eq!(ANGLE0.rad,0f64);
        assert_eq!(Angle::new(0f64),ANGLE0);
        assert_eq!(Angle::from(1f64,1f64),ANGLE45);
        assert_eq!(Angle::new(PI/2f64),ANGLE90);
        assert_eq!(Angle::new(PI),ANGLE180);
        let mut a=ANGLE0;
        a.set_degree(90f64);
        assert_eq!(a.get_radian(),PI/2f64);

        a.set_radian(PI);

        assert_eq!(a.get_degree(),180f64);

        a=Angle::from(1f64,1f64);
        assert_eq!(a.get_degree(),45f64);

        assert_eq!(a.unit_y()/a.unit_x(),1f64);
        assert_eq!(ANGLE45+ANGLE45,ANGLE180-ANGLE90);
        assert_eq!(ANGLE45*2f64,ANGLE180/2f64);
        assert_eq!(ANGLE45*ANGLE45,ANGLE180/ANGLE90);
    }
}

3. main.rs 补充调试内容

pub mod unit;
use crate::unit::angle::*;
fn main() {
    println!("角度:{}°", ANGLE180.get_degree());
}

五、运行

1. 运行程序

在命令行窗口,项目目录下运行程序(cmd命令:cargo run)
运行程序## 2.单元调试
在命令行窗口,项目目录下运行测试(cmd命令:cargo test)
测试程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105469.html

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

相关文章

白酒酿造:传统工艺与现代科技的整合

在千年的历史长河中&#xff0c;白酒酿造技艺如一颗璀璨的明珠&#xff0c;闪烁着中华文明的智慧光芒。如今&#xff0c;随着科技的飞速发展&#xff0c;传统酿造工艺与现代科技在这片古老的土地上交织碰撞&#xff0c;共同书写着白酒酿造的新篇章。豪迈白酒&#xff08;HOMANL…

828华为云征文|基于华为云Flexus云服务器X搭建FTP服务器

❀目录 ❀概述❀特点❀环境准备❀安装❀配置文件修改❀创建目录、修改权限❀控制台安全组开启21端口❀工具验证❀总结 ❀概述 FTP文件传输协议是一种在网络中进行文件传输的广泛使用的标准协议。作为网络通信中的基础工具&#xff0c;FTP允许用户通过客户端软件与服务器进行交…

栈和队列——用栈实现队列

栈的特点是先进后出&#xff0c;队列的特点是先进先出。根据题中要求&#xff0c;我们应用两个栈实现一个队列。我们可以类比用队列实现栈&#xff0c;我们可以先将元素都插入到栈1中&#xff0c;当我们想要取出元素时&#xff0c;我们可以将栈1中的所有数据依次插入到栈2中&am…

污点、容忍、不可调度、排水、数据卷

目录 污点taint 污点的格式 1. key:effect 键名&#xff1a;污点类型 2. keyvalue:effect 键名数值&#xff1a;污点类型 污点的类型 1. NoSchedule 2. PreferNoSchedule 3. NoExecute&#xff08;驱逐&#xff09; 设置污点&#xff08;主节点操作&#xff09…

STM32:通过旋转计数器的计数控制舵机旋转的角度

声明&#xff1a;本博客为各模块之间结合的自主研究学习。 目录 一、按键操控舵机旋转&#xff08;单向&#xff09; 1.1、实物图讲解 1.2、代码讲解 1.2.1、PWM.c 具体步骤&#xff1a; 完整代码&#xff1a; 1.2.2、PWM.h 1.2.3、Servo.c && Servo.h 1.2.4、…

ts 类型分类

目录 01 ts 相关指令 02 类型声明空间与变量声明空间 03 类型注解和类型推断 04 类型分类 , 联合类型与交叉类型 05 never类型 any类型 和unknown类型 01 ts 相关指令 全局安装 typescript 模块 npm i -g typescript 安装完成之后 可以将ts文件转换成js文件 tsc xxx.ts…

为什么越来越多的人选择开放式耳机?平价高品质蓝牙耳机推荐

越来越多的人选择开放式耳机&#xff0c;主要是因为其具有多方面的优势&#xff0c;具体如下&#xff1a; 佩戴舒适度高&#xff1a;开放式耳机不入耳&#xff0c;不堵塞耳道&#xff0c;避免了对耳道的压迫和摩擦&#xff0c;长时间佩戴也不易产生闷热感和不适感。例如&#x…

windows安装git

windows安装git 1.通过git官网下载 官网&#xff1a;https://git-scm.com/downloads 2.安装git &#xff08;1&#xff09;找到下载到的文件&#xff0c;进行双击进行安装 &#xff08;2&#xff09;安装使用说明点击Next &#xff08;3&#xff09;选择自己的安装地址&a…

大屏可视化:阿里 DataV 大屏怎么做自适应的?

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 阿里 DataV 大屏是一款功能强大的数据可视化应用搭建工具&#xff0c;由阿里云提供&#xff0c;旨在帮助用户通过图形化的界面轻松搭建专业水准的可视化应用。 下面我们一起看下 DataV 大屏 是如何做自适应…

【嵌入式】uint32值写入到二进制文件中的存储详情

背景 项目预留100字节用于存储参数文件。现在有些数值一个字节表示不够&#xff0c;需要用4个字节。比如数值1144201745&#xff0c;对应的十六进制0x44332211,那么在二进制中存储是怎么样的呢&#xff1f;做个总结 分析 写了一个sample&#xff0c;把uint32_t u32Value1{0x…

【ThreadLocal源码】深入浅出ThreadLocal

【ThreadLocal源码】深入浅出ThreadLocal-CSDN博客

Linux之Prometheus

认识普罗米修斯 1、prometheus介绍 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合, 由go语言开发。 适合监控容器平台, 因为kubernetes(俗称k8s)的流行带动了prometheus的发展。 PS&#xff1a;文档使用prometheus监控物理服务器。 prometheus的…

数组程序基础知识

为了处理方便&#xff0c;把具有相同类型的变量按有序的形式组织起来。这些同类数据元素的集合称之为数组。数组可分为数值数组、字符数组、指针数组、结构数组等。 01--一维数组 在使用数组前需要先定义&#xff1a; 类型说明符 数组名[常量表达式]&#xff1b; 类型说明符…

因 Mysql root 密码过于简单导致 Mysql 连接失败的解决方法

问题&#xff1a; Access denied for user ‘root’‘192.168.xx.xx’ (using password: YES) 用户“root”“192.168.xx.xx”的访问被拒绝&#xff08;使用密码&#xff1a;YES&#xff09; 解决方法&#xff1a; 1、使用root用户登录mysql&#xff0c;通过下面的命令给ro…

数据管理能力成熟度评估模型DCMM

一、引言 DCMM&#xff08;Data Management Capability Maturity Assessment Model&#xff0c;数据管理能力成熟度评估模型&#xff09;是我国首个数据管理领域国家标准&#xff08;GB/T 36073-2018&#xff09;&#xff0c;由中国国家标准化管理委员会于2018年3月15日发布&am…

FreeRTOS基础入门——FreeRTOS信号量及二值信号量(十三)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

智联云采 SRM2.0 autologin 身份认证绕过漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案,针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

【王树森】RNN模型与NLP应用(4/9):LSTM模型(个人向笔记)

前言 LSTM是对Simple RNN的改进&#xff0c;可以避免梯度消失的问题&#xff0c;能够有更长的记忆力。 LSTM 1. LSTM:Conveyor Belt 过去的信息 C t − 1 C_{t-1} Ct−1​ 通过一个传输带直接输送到下一个状态 C t C_t Ct​&#xff0c;不会发生太大的变化&#xff0c;由此…

激活函数 Sigmod 及其导数

文章目录 1. Sigmod 函数2. 取值3. 图像4. 导数 1. Sigmod 函数 Sigmod 函数是神经网络中最常用的激活函数之一&#xff0c;其形式如下&#xff1a; sigmod ( x ) f ( x ) 1 1 e − x . \text{sigmod}(x) f(x) \frac{1}{1 e^{-x}}. sigmod(x)f(x)1e−x1​. 2. 取值 分…

大模型理论基础

大模型理论基础与学习路径 1.大模型的理论基础&#xff0c;包括深度学习、预训练语言模型和大语言模型。 2.学习大模型开发的路径&#xff0c;包括理论学习、实践操作和项目应用。 3.如何通过理论学习提升上限&#xff0c;为深入学习大模型奠定基础。 GPT模型家族技术发展 1.GP…