#si-units #units #si #physics

bin+lib si-vectors

物理计算的Rust库

1 个不稳定版本

0.1.0 2024年1月20日

#368 in 科学

Apache-2.0

28KB
461

Rust物理引擎

国际单位制单位枚举

防止拼写错误并提高代码可读性

  1. 千克
  2. 安培
  3. 开尔文
  4. 摩尔
  5. 坎德拉

您可以打印它们

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

派生单位

  1. 赫兹
  2. 牛顿
  3. 帕斯卡
  4. 焦耳
  5. 瓦特
  6. 伏特
  7. 库仑
  8. 西弗

派生量

  1. 速度
  2. 速度
  3. 加速度
  4. 面积
  5. 体积
  6. 质量
  7. 时间
  8. 标量
  9. 距离

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);

无运行时依赖