【从头写CAD】第一章 计量单位 第一节 建立项目及角度类

news/2024/9/18 15:24:54 标签: rust

文章目录

  • 一、说明
  • 二、操作步骤
  • 三、角度单位
  • 四、源代码
    • 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 内容

rust">pub mod angle;

2. angle.rs 内容

rust">/*
* 角度弧度的类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 补充调试内容

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

五、运行

1. 运行程序

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


http://www.niftyadmin.cn/n/5640911.html

相关文章

Spring学习(四)-AOP

Spring学习&#xff08;四&#xff09;-AOP –2020年06月26日 一、AOP的概念 面向切面编程。 利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 通俗描述&am…

记录一下blender烘焙贴图黑边的一个坑

首先是拆UV这里 margin 0.1 better share better 这个也大一点好了 这样烘焙的猴头就是正常的 这里的坑点是 降噪&#xff01;&#xff01;烘焙如果开启降噪 如果关闭下面那一个 会好一点&#xff0c;都关闭了&#xff0c;才是最上面的效果

轻量级模型解读——MobileNet系列

MobileNet系列到现在2024年&#xff0c;已经出到了第四个版本&#xff0c;分别如下&#xff1a; 2017年MobileNetv1——>2018年MobileNetv2——>2019年MobileNetv3——>2024年MobileNetv4&#xff0c;下面简要概述一下几个版本的改进部分。 目录 1、MobileNetv12、Mob…

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误&#xff0c;这给本地调试造成了极大的不便&#xff0c;在被这个问题困扰了多日以后&#xff0c;终于在GitHub上找到答案 基于这个 帖子 &#xff0c;有一个回复 他写了一个帮助类&#xff0c;专门用来调试本地的API&#xff0c;…

quarkus解说

Quarkus 是一个开源的、针对云原生应用设计的 Kubernetes 原生 Java 框架。 它由 Red Hat 开发&#xff0c;并且是基于 Java EE 和 MicroProfile 标准构建的。 Quarkus 的主要目标是提供一个轻量级、高性能的运行时环境&#xff0c;特别适合微服务架构和无服务器&#xff08;…

SparkRA带你读论文 | 如何训练数据高效的 LLMs

简介 How to Train Data-Efficient LLMs 论文作者&#xff1a; Noveen Sachdeva, Benjamin Coleman, Wang-Cheng Kang, Jianmo Ni, Lichan Hong Ed H. Chi, James Caverlee, Julian McAuley, Derek Zhiyuan Cheng 论文链接&#xff1a; https://arxiv.org/pdf/2402.09668.pd…

Vuex Module Decorators 使用指南

vuex-module-decorators 是基于 TypeScript 的 Vuex 装饰器库&#xff0c;它允许我们使用装饰器模式编写模块化的 Vuex 代码&#xff0c;使得代码更加简洁和可维护。对于 Vue.js 项目&#xff0c;尤其是使用 TypeScript 的项目&#xff0c;vuex-module-decorators 提供了一种更…

livekitAI对话实践(python+next)

https://docs.livekit.io/home/self-hosting/local/ 1)根据上面的教程启动livekit服务 livekit-server --dev --bind 0.0.0.0 保证局域网内都可以访问 启动成功后访问页面192.168.1.138:7800 是一个ok 2)根据下面的教程启动前端(next)和后端服务 需要注意的是 export L…