use crate::model::{Model, State};
pub fn kinetic_energy(model: &Model, state: &State) -> f64 {
let m = crate::crba(model, state);
0.5 * state.v.dot(&(&m * &state.v))
}
pub fn potential_energy(model: &Model, state: &State) -> f64 {
let (xforms, _) = super::forward_kinematics(model, state);
let mut pe = 0.0;
for (i, body) in model.bodies.iter().enumerate() {
let mass = body.inertia.mass;
let com_local = body.inertia.com;
let xf = &xforms[i];
let com_world = xf.rot.transpose() * com_local + xf.pos;
pe -= mass * model.gravity.dot(com_world);
}
pe
}
pub fn total_energy(model: &Model, state: &State) -> f64 {
kinetic_energy(model, state) + potential_energy(model, state)
}