文章目录
- 一、说明
- 二、操作步骤
- 三、角度单位
- 四、源代码
- 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)