#![allow(unused)]
use crate::errors;
const SPEED_OF_LIGHT: f64 = 3.0 * 100_000_000.0;
const GRAVITY_ON_EARTH: f64 = 9.81;
const GRAVITY_ON_MOON: f64 = 1.625;
pub struct SuvatOps1D {
s: Option<f64>, u: Option<f64>, v: Option<f64>, a: Option<f64>, t: Option<f64>, }
pub struct SuvatOps2D {
s: (Option<f64>, Option<f64>), u: (Option<f64>, Option<f64>), v: (Option<f64>, Option<f64>), a: (Option<f64>, Option<f64>), t: Option<f64>, }
pub mod suvat {
use crate::errors::FphicsError;
pub use crate::physics::*;
impl SuvatOps1D {
pub fn new() -> Self {
Self {
s: None, u: None, v: None, a: None, t: None, }
}
pub fn displacement(mut self, val: f64) -> Self {
self.s = Some(val);
self
}
pub fn initial_velocity(mut self, val: f64) -> Self {
self.u = Some(val);
self
}
pub fn final_velocity(mut self, val: f64) -> Self {
self.v = Some(val);
self
}
pub fn acceleration(mut self, val: f64) -> Self {
self.a = Some(val);
self
}
pub fn time(mut self, val: f64) -> Self {
self.t = Some(val);
self
}
pub fn calculate_displacement(&self) -> Result<f64, errors::FphicsError> {
match (self.u, self.v, self.a, self.t) {
(Some(u_val), _, Some(a_val), Some(t_val)) => {
Ok((u_val * t_val) + (0.5 * a_val * (t_val * t_val)))
},
(Some(u_val), Some(v_val), Some(a_val), _) => {
if a_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok(((v_val * v_val) - (u_val * u_val)) / (2.0 * a_val))
}
},
(_, Some(v_val), Some(a_val), Some(t_val)) => {
Ok((v_val * t_val) - (0.5 * a_val * (t_val * t_val)))
},
(Some(u_val), Some(v_val), _, Some(t_val)) => {
Ok(((u_val + v_val) / 2.0) * t_val)
},
_ => Err(errors::FphicsError::IncompleteData)
}
}
pub fn calculate_initial_velocity(&self) -> Result<f64, errors::FphicsError> {
match (self.s, self.v, self.a, self.t) {
(Some(s_val), _, Some(a_val), Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok((s_val / t_val) - (0.5 * a_val * t_val))
}
},
(Some(s_val), Some(v_val), Some(a_val), _) => {
if ((v_val * v_val) - (2.0 * a_val * s_val)) < 0.0 {
Err(errors::FphicsError::NegativeSquareRoot)
} else {
Ok(((v_val * v_val) - (2.0 * a_val * s_val)).sqrt())
}
},
(Some(s_val), Some(v_val), _, Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok(((2.0 * s_val) / t_val) - v_val)
}
},
(_, Some(v_val), Some(a_val), Some(t_val)) => {
Ok(v_val - (a_val * t_val))
},
_ => Err(errors::FphicsError::IncompleteData)
}
}
pub fn calculate_final_velocity(&self) -> Result<f64, errors::FphicsError> {
match (self.s, self.u, self.a, self.t) {
(Some(s_val), Some(u_val), Some(a_val), _) => {
let val = (u_val * u_val) + (2.0 * a_val * s_val);
if val < 0.0 {
Err(errors::FphicsError::NegativeSquareRoot)
} else {
Ok(val.sqrt())
}
},
(Some(s_val), _, Some(a_val), Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok((s_val / t_val) + (0.5 * a_val * t_val))
}
},
(Some(s_val), Some(u_val), _, Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok(((2.0 * s_val) / t_val) - u_val)
}
},
(_, Some(u_val), Some(a_val), Some(t_val)) => {
Ok(u_val + (a_val * t_val))
},
_ => Err(errors::FphicsError::IncompleteData)
}
}
pub fn calculate_acceleration(&self) -> Result<f64, errors::FphicsError> {
match (self.s, self.u, self.v, self.t) {
(Some(s_val), Some(u_val), Some(v_val), _) => {
if s_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok(((v_val * v_val) - (u_val * u_val)) / (2.0 * s_val))
}
},
(Some(s_val), Some(u_val), _, Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok(((2.0 * s_val) - (2.0 * u_val * t_val)) / (t_val * t_val))
}
},
(Some(s_val), _, Some(v_val), Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok(((2.0 * v_val * t_val) - (2.0 * s_val)) / (t_val * t_val))
}
},
(_, Some(u_val), Some(v_val), Some(t_val)) => {
if t_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
Ok((v_val - u_val) / t_val)
}
},
_ => Err(errors::FphicsError::IncompleteData)
}
}
pub fn calculate_time(&self) -> Result<Vec<f64>, errors::FphicsError> {
let mut vals = Vec::with_capacity(2);
match (self.s, self.u, self.v, self.a) {
(Some(s_val), Some(u_val), _, Some(a_val)) => {
let discriminant = (u_val * u_val) - (2.0 * a_val * -s_val);
if discriminant < 0.0 {
Err(errors::FphicsError::NegativeSquareRoot)
} else {
if a_val == 0.0 {
return Err(errors::FphicsError::DivisionByZero);
}
vals.push(((- u_val) + discriminant.sqrt()) / a_val);
vals.push(((- u_val) - discriminant.sqrt()) / a_val);
Ok(vals)
}
},
(Some(s_val), _, Some(v_val), Some(a_val)) => {
let discriminant = (v_val * v_val) - (2.0 * a_val * s_val);
if discriminant < 0.0 {
Err(errors::FphicsError::NegativeSquareRoot)
} else {
vals.push(((-v_val) + discriminant.sqrt()) / -a_val);
vals.push(((-v_val) - discriminant.sqrt()) / -a_val);
Ok(vals)
}
},
(_, Some(u_val), Some(v_val), Some(a_val)) => {
if a_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
vals.push((v_val - u_val) / a_val);
Ok(vals)
}
},
(Some(s_val), Some(u_val), Some(v_val), _) => {
if u_val + v_val == 0.0 {
Err(errors::FphicsError::DivisionByZero)
} else {
vals.push((2.0 * s_val) / (u_val + v_val));
Ok(vals)
}
},
_ => Err(errors::FphicsError::IncompleteData)
}
}
}
impl SuvatOps2D {
pub fn new() -> Self {
Self {
s: (None, None), u: (None, None), v: (None, None), a: (None, None), t: None, }
}
pub fn displacement(mut self, val: (f64, f64)) -> Self {
self.s.0 = Some(val.0);
self.s.1 = Some(val.1);
self
}
pub fn initial_velocity(mut self, val: (f64, f64)) -> Self {
self.u.0 = Some(val.0);
self.u.1 = Some(val.1);
self
}
pub fn final_velocity(mut self, val: (f64, f64)) -> Self {
self.v.0 = Some(val.0);
self.v.1 = Some(val.1);
self
}
pub fn acceleration(mut self, val: (f64, f64)) -> Self {
self.a.0 = Some(val.0);
self.a.1 = Some(val.1);
self
}
pub fn time(mut self, val: f64) -> Self {
self.t = Some(val);
self
}
pub fn calculate_displacement(&self) -> Result<(f64, f64), errors::FphicsError> {
let u = self.u;
let v = self.v;
let a = self.a;
let t = self.t;
let i_component = SuvatOps1D {
s: None,
u: u.0,
v: v.0,
a: a.0,
t: t,
}.calculate_displacement()?;
let j_component = SuvatOps1D {
s: None,
u: u.1,
v: v.1,
a: a.1,
t: t,
}.calculate_displacement()?;
Ok((i_component, j_component))
}
pub fn calculate_initial_velocity(&self) -> Result<(f64, f64), FphicsError> {
let s = self.s;
let v = self.v;
let a = self.a;
let t = self.t;
let i_component = SuvatOps1D {
s: s.0,
u: None,
v: v.0,
a: a.0,
t: t,
}.calculate_initial_velocity()?;
let j_component = SuvatOps1D {
s: s.1,
u: None,
v: v.1,
a: a.1,
t: t,
}.calculate_initial_velocity()?;
Ok((i_component, j_component))
}
pub fn calculate_final_velocity(&self) -> Result<(f64, f64), FphicsError> {
let s = self.s;
let u = self.u;
let a = self.a;
let t = self.t;
let i_component = SuvatOps1D {
s: s.0,
u: u.0,
v: None,
a: a.0,
t: t,
}.calculate_final_velocity()?;
let j_component = SuvatOps1D {
s: s.1,
u: u.1,
v: None,
a: a.1,
t: t,
}.calculate_final_velocity()?;
Ok((i_component, j_component))
}
pub fn calculate_acceleration(&self) -> Result<(f64, f64), FphicsError> {
let s = self.s;
let u = self.u;
let v = self.v;
let t = self.t;
let i_component = SuvatOps1D {
s: s.0,
u: u.0,
v: v.0,
a: None,
t: t,
}.calculate_acceleration()?;
let j_component = SuvatOps1D {
s: s.1,
u: u.1,
v: v.1,
a: None,
t: t,
}.calculate_acceleration()?;
Ok((i_component, j_component))
}
pub fn calculate_time(&self) -> Result<(Vec<f64>, Vec<f64>), FphicsError> {
let s = self.s;
let u = self.u;
let v = self.v;
let a = self.a;
let time_i = SuvatOps1D {
s: s.0,
u: u.0,
v: v.0,
a: a.0,
t: None,
}.calculate_time()?;
let time_j = SuvatOps1D {
s: s.1,
u: u.1,
v: v.1,
a: a.1,
t: None,
}.calculate_time()?;
Ok((time_i, time_j))
}
}
}
mod materials {}
mod dynamics {}
mod electricity {}