【从头写CAD】3 长度类

news2024/9/22 23:18:23

文章目录

  • 一、说明
  • 二、源码
  • 三、运行和调试结果


一、说明

长度的国际单位是“米”(符号“m”),常用单位有毫米(mm)、厘米(cm)、分米(dm)、千米(km)、米(m)、微米(μm)、纳米(nm)等等。英寸等英制单位在国内有少量使用,我们继续在程序中体现它们的存在。
工程设计中,最多使用的单位是毫米(mm)。我选择米(m)作为长度类的基准单位。理由有2点:1、米(m)是国际标准单位;2、我使用AutoCAD多年,制图时对长度单位的选择并不敏感,默认长度无量纲(无单位),等标注时通过调整标注比例确定实际长度。
备注:长度类的主要应用场景在尺寸标注和单位换算。


二、源码

/*
* 长度米的类m
* 编制人: $ource
* 修改版次及创建时间:0版完成版(2021年8月24日)
* 修改内容及时间:2024年9月3日
* 待完善问题:无
*/
use std::ops::{Add, Sub, Mul, Div};
//长度单位枚举
pub enum LengthUnit {
    m,              //米 Meter
    dm,      //分米 Decimeter: 0.1m */
    cm,             //厘米 Centimeter: 0.01m
    mm,             //毫米 Millimeter=0.001m
    Micron,         //微米 Micron: 10^-6m  μm
    nm,             //纳米 Nanometer: 10^-9m
    km,             //千米 Kilometer: 1000m

    Inch,           //英寸 Inch '
    Foot,           //英尺 Foot= 12 Inches "

    Other(f64),     //其它 No unit
}


#[derive(Debug,PartialEq,PartialOrd,Clone,Copy)]
pub struct Length{
    pub m:f64
}

impl Length{
    pub fn new(m:f64)->Self{
        Length{m}
    }

    pub fn from(unit:LengthUnit,value:f64)->Self{
        match unit{
            LengthUnit::m => {Length{m:value}}
            LengthUnit::dm => {Length{m:value*0.1f64}}
            LengthUnit::cm => {Length{m:value*0.01f64}}
            LengthUnit::mm => {Length{m:value*0.001f64}}
            LengthUnit::Micron => {Length{m:value*1e-6f64}}
            LengthUnit::nm => {Length{m:value*1e-9f64}}
            LengthUnit::km => {Length{m:value*1e3f64}}
            LengthUnit::Inch => {Length{m:value*0.0254f64}}
            LengthUnit::Foot => {Length{m:value*0.3048f64}}
            LengthUnit::Other(s) => {Length{m:value*s}}
        }
    }

    pub fn to(&self,unit:LengthUnit)->f64{
        match unit{
            LengthUnit::m => {self.m}
            LengthUnit::dm => {self.m/0.1f64}
            LengthUnit::cm => {self.m/0.01f64}
            LengthUnit::mm => {self.m/0.001f64}
            LengthUnit::Micron => {self.m/1e-6f64}
            LengthUnit::nm => {self.m/1e-9f64}
            LengthUnit::km => {self.m/1e3f64}
            LengthUnit::Inch => {self.m/0.0254f64}
            LengthUnit::Foot => {self.m/0.3048f64}
            LengthUnit::Other(s) => {self.m/s}
        }
    }

    pub fn set_m(&mut self, m:f64){
        self.m=m;
    }
    pub fn get_m(&self)->f64{
        self.m
    }
}

//运算符重载 + - * /,实现加减及比例缩放。
impl Add<Length> for Length{//加法
    type Output = Self;
    fn add(self, other: Self) ->Length{
        Self{m:self.m + other.m}
    }
}

impl Sub<Length> for Length{//减法
    type Output = Self;
    fn sub(self, other: Self) ->Length{
        Self{m:self.m - other.m}
    }
}

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

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

pub const LENGTH_MAX:Length=Length{m:1.0E+10f64};
pub const LENGTH_MIN:Length=Length{m:1.0E-10f64};
pub const LENGTH0:Length=Length{m:0f64};

#[cfg(test)]   //cfg 属性负责控制条件编译,并仅会在谓词为 true 时编译其所附带的内容。cargo test 时满足运行条件
mod tests {
    use super::*;
    #[test]
    fn length_test() {
        assert_eq!(LENGTH0.m,0f64);
        assert_eq!(Length::new(0f64),LENGTH0);
        assert_eq!(Length::from(LengthUnit::m,1f64).to(LengthUnit::m),1f64);
        assert_eq!(Length::from(LengthUnit::cm,1f64).to(LengthUnit::cm),1f64);
        assert_eq!(Length::from(LengthUnit::mm,1f64).to(LengthUnit::mm),1f64);
        assert_eq!(Length::from(LengthUnit::Micron,1f64).to(LengthUnit::Micron),1f64);
        assert_eq!(Length::from(LengthUnit::nm,1f64).to(LengthUnit::nm),1f64);
        assert_eq!(Length::from(LengthUnit::km,1f64).to(LengthUnit::km),1f64);
        assert_eq!(Length::from(LengthUnit::Inch,1f64).to(LengthUnit::Inch),1f64);
        assert_eq!(Length::from(LengthUnit::Foot,1f64).to(LengthUnit::Foot),1f64);
        assert_eq!(Length::from(LengthUnit::Other(11f64),2f64).to(LengthUnit::Other(22f64)),1f64);
        assert_eq!(Length::new(1.0E+10f64),LENGTH_MAX);
        assert_eq!(Length::new(1.0E-10f64),LENGTH_MIN);
        assert_eq!(Length::new(1f64)+Length::new(2f64),Length::new(4f64)-Length::new(1f64));
        assert_eq!(Length::new(1f64)*2f64,Length::new(4f64)/2f64);
    }
}

三、运行和调试结果

运行结果

调试结果

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

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

相关文章

装WebVideoCreator记录

背景&#xff0c;需要在docker容器内配置WebVideoCreator环境&#xff0c;配置npm、node.js https://github.com/Vinlic/WebVideoCreatorWebVideoCreator地址&#xff1a;https://github.com/Vinlic/WebVideoCreator 配置环境&#xff0c;使用这个教程&#xff1a; linux下安…

非负矩阵分解

非负矩阵分解 简单来说&#xff0c;就是一个数据矩阵X&#xff0c;也可以理解为特征矩阵&#xff0c;将这个矩阵分解为两个非负矩阵W和H的乘积。 公式可以写成下面&#xff1a; 这里的m和n就是特征的维度&#xff0c;r表示代码中n_components参数 来看个例子&#xff1a; 看看…

office套件打开时 提示操作系统当前的配置不能运行此应用程序

起因使用了腾讯电脑管家的软件搬家功能。 许久后发现打开word提示。 随后使用软件搬家功能中的搬移历史中还原office套件。 依然不可用&#xff08;未尝试重启 大概率重启之后就可以用了 使用的电脑不方便重启&#xff09; 安装office简易修复工具 地址&#xff1a;https://a…

C++相关概念和易错语法(31)(特殊类的设计、new和delete底层调用分析)

特殊类的设计 在实践过程中&#xff0c;我们难免会接触到一些需要实现特定功能的类。像之前提过的unique_ptr就是直接delete拷贝构造和赋值函数。下面会分享一些常见的特殊类的实现 1、防拷贝和防赋值 通过封死拷贝构造和赋值函数来保护对象里面内容不被复制。如果对象里面的…

JS 对象深浅拷贝

1. 浅拷贝的原理和实现 自己创建一个新的对象&#xff0c;来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型&#xff0c;复制的就是基本类型的值给新对象&#xff1b;但如果属性是引用数据类型&#xff0c;复制的就是内存中的地址&#xff0c;如果其中一个对象…

从0开始学杂项 第八期:流量分析(2) 数据提取

Misc 学习&#xff08;八&#xff09; - 流量分析&#xff1a;数据提取 这一期&#xff0c;我们主要写一下如何进行比较繁多的数据的提取。 使用 Tshark 批量提取数据 有时候&#xff0c;我们会需要从多个包中提取数据&#xff0c;然后再进行截取和组合&#xff0c;比如分析…

千云物流 -低代码平台MySQL备份数据

windows备份 全量备份 创建备份目录 需要在安装数据库的服务器上创建备份目录,所有如果要做备份至少需要两倍的硬盘空间, mkdir D:\mysql_backup\full_backup准备备份脚本 创建一个windows批处理文件(例如 full_backup.bat),用来执行全量备份并使用 robocopy 将备份文件…

HTTP 一、基础知识

一、概述 1、概述 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全称超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。HTTP 是一种应用层协议&#xff0c;是基于 …

VUE3 使用 <transition> 实现组件切换的过渡效果

由于我想在项目中实现路由组件切换时的平滑过渡效果&#xff0c;以避免页面加载时的突兀感&#xff0c;大致效果如下&#xff1a; 上面的代码是使用的若依的代码&#xff0c;代码具体如下所示&#xff1a; <section class"app-main"><transition name&quo…

HarmonyOS开发移动应用:调用百度翻译开放平台的App Id和密钥

介绍 通过http请求和HarmonyOS自带的加密框架&#xff0c;可以为移动应用实现调用百度翻译API的功能。 开发环境要求 • DevEco Studio版本&#xff1a;DevEco Studio 3.1 Release • HarmonyOS SDK版本&#xff1a;API version 9 工程要求 • API9 • Stage模型 正文 ▍代码…

QT+OSG+osg-earth显示一个球

目录 1、环境配置 2、在QT Creator导入相关的库 3、代码部分 4、运行过程中的问题 5、相关参考 重要衔接&#xff1a;QTOSG显示一个三维模型-CSDN博客 1、环境配置 系统&#xff1a;windows10系统 QT:版本5.15.2 编译器&#xff1a;MSVC2019_64bit 编辑器…

Conda在线/离线迁移虚拟环境

conda简单使用 1.创建环境&#xff1a; conda create -n myenv python3.82.激活环境 conda activate myenv3.退出环境 conda deactivate4.安装包 pip install xxx5.列出所有环境 conda env list conda info --envs6.删除环境 conda remove -n myenv --all离线迁移conda …

GD32F103单片机-概述和工程建立

GD32F103单片机-概述和工程建立 一、GD32F103单片机介绍1.1 GD32F103C8T6引脚1.2 GD32F103C8T6系统架构和启动配置1.3 GD32F103C8T6时钟树 二、GD32F103工程建立 一、GD32F103单片机介绍 GD32F103系列由是由国内公司兆易创新生产的基于Arm Cortex-M3处理器的单片机位数&#x…

陪诊志愿服务正在开展,喜鹊医疗打造国内首家陪诊聚合平台

2024年8月&#xff0c;为了培养一支专业、合格的陪诊志愿服务队伍&#xff0c;为志愿者提供就业帮扶&#xff0c;也满足社会日益增长的健康需求。由喜鹊医疗捐赠专项资金&#xff0c;中国民族卫生协会联合中国志愿基金会共同开展“健康中国行&#xff0c;陪诊惠民工程——陪诊志…

django学习入门系列之第十点《django中数据库操作--创建与删除表》

文章目录 django创建与删除表开始创建表创建指令新增表删除表删除列新增列修改报错提示语言总结 往期回顾 django创建与删除表 删除表 创建表 修改表 操作目录 开始创建表 class text_into(models.Model):name models.CharField(max_length32)password models.CharField…

二手手机回收小程序搭建,小程序功能特点

随着社会生活水平的提高&#xff0c;对手机的更新换代的速度也在逐渐加快&#xff0c;出现了大量的闲置手机&#xff0c;而这也给手机回收市场带来了巨大的发展空间&#xff01; 目前&#xff0c;手机回收市场进入到了发展快速期&#xff0c;吸引了越来越多的企业加入大市场中…

java重点学习-spring

三 spring 3.1 Spring框架中的单例bean是线程安全的吗? 不是线程安全的 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。 因为一般在spring的bean的中都是注入无状态的对象&#xff0c;没有线程安全问题&#xff0c;如果在bean中定义了…

基于纠错码的哈希函数构造方案

一、前言 随着大数据时代的到来&#xff0c;交通数据量急剧增加&#xff0c;由此带来的交通安全问题日益凸显。传统的驾驶人信用管理系统在数据存储和管理上存在着诸多不足之处&#xff0c;例如中心化存储方案无法有效地进行信用存证及数据溯源。区块链技术以其去中心化和不可…

移动硬盘无法访问怎么修复?

移动硬盘是一种方便的存储设备&#xff0c;但有时可能会遇到无法访问的问题。这不仅影响工作效率&#xff0c;还可能导致数据丢失。本文将详细介绍在Windows系统中移动硬盘无法访问怎么修复&#xff0c;帮助您恢复数据和硬盘功能。 移动硬盘无法访问的常见原因 硬盘故障&#…

1998-2023年上市公司金融/信贷/资本资源错配程度数据(含原始数据+计算代码+结果)

1998-2023年上市公司金融/信贷/资本资源错配程度数据&#xff08;含原始数据计算代码结果&#xff09; 1、时间&#xff1a;1998-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、year、应付账款、负债合计、利息支出、行业代码、是否ST或PT、上市日期…