1 个不稳定版本
0.1.0 | 2024年1月20日 |
---|
#368 in 科学
28KB
461 行
Rust物理引擎
国际单位制单位枚举
防止拼写错误并提高代码可读性
- 米
- 秒
- 千克
- 安培
- 开尔文
- 摩尔
- 坎德拉
您可以打印它们
println!("An apple is aproximately 1 {}",SiUnit::Kilogram);
println!("A minute is aproximately 60 {}s",SiUnit::Second);
Value结构体
创建一个结构体,它包含一个f64和一个国际单位制单位的向量,一个用于分子,另一个用于分母
let fast = Value{magnitude: 10_f64,si_units_num: Vec::from([SiUnit::Metre]),si_units_den: Vec::from([SiUnit::Second,SiUnit::Second])};
let slow = Value{magnitude: 2_f64,si_units_num: Vec::from([SiUnit::Metre]),si_units_den: Vec::from([SiUnit::Second,SiUnit::Second])};
添加值
println!("{}",fast.clone()+slow.clone());
乘值
请注意,执行乘法时单位会改变
println!("{}",fast.clone() * slow.clone());
我们还可以进行除法
let distance = Value{magnitude: 20_f64,si_units_num: Vec::from([SiUnit::Metre]),si_units_den: Vec::<SiUnit>::new()};
let time = Value{magnitude: 2_f64,si_units_num: Vec::from([SiUnit::Second]),si_units_den: Vec::<SiUnit>::new()};
let speed = distance/time;
println!("Speed is {}",speed);
我们得到一个表示速度的Value,而不必显式创建它。
派生单位和派生量
我们可以使用内置枚举派生单位和派生量中的Value模板,而不是每次都声明整个Value
派生单位
- 赫兹
- 牛顿
- 帕斯卡
- 焦耳
- 瓦特
- 伏特
- 库仑
- 西弗
派生量
- 速度
- 速度
- 加速度
- 面积
- 体积
- 质量
- 力
- 时间
- 标量
- 距离
get_value函数
get_value函数返回一个Value类型,而set_magnitude函数改变幅度。
let force = DerivedQuantities::Force.get_value().set_magnitude(15_f64);
let pressure = DerivedUnit::Pascals.get_value().set_magnitude(5_f64);
let area = force/pressure;
println!("{}",area);
same()函数
我们还可以通过使用same()函数将获取的Value与内置的Area模板进行比较来检查我们获取的Value是否确实是面积
assert!(area.same(&DerivedQuantities::Area.get_value()));
国际单位制常数
您还可以使用一些内置的物理常数
let g = SiConstant::GravitationalConstant.get_value();
let c = SiConstant::SpeedOfLight.get_value();
println!("Gravitational Constant is {}",g);
println!("Soeed of light is {}",c);
示例
我们可以使用地球的质量、半径和万有引力常数来推导地球的重力加速度。g = Gm/(r^2),其中g是加速度,G是万有引力常数,m是质量,r是半径。
let earth_mass = DerivedQuantities::Mass.get_value().set_magnitude(5.972e24);
let earth_radius = DerivedQuantities::Distance.get_value().set_magnitude(6371e3);
let g = SiConstant::GravitationalConstant.get_value();
let acc = g*earth_mass/earth_radius.powi(2);
assert!(acc.same(&DerivedQuantities::Acceleration.get_value()));
println!("{}",acc);
向量
我们还可以表示包含方向的物理向量
let v = Vector{value: DerivedQuantities::Force.get_value(),theta: PI};
println!("{}",v);
我们可以添加向量
let car1 = Vector{value: DerivedQuantities::Force.get_value(),theta: 0_f64};
let car2 = Vector{value: DerivedQuantities::Force.get_value(),theta: PI/2.0};
let collision = car1+car2;
println!("{}",collision);
我们可以进行乘法
let v1 = Vector{value: DerivedQuantities::Force.get_value(),theta: 0_f64};
let v2 = Vector{value: DerivedQuantities::Force.get_value(),theta: PI/2.0};
let product = v1*v2;
println!("{}",product);