pub mod scl {
pub fn polynom(arg: f64, coef: &[f64]) -> f64 {
let pow = coef.len() - 1;
let mut ss = coef[pow];
for i in Iterator::rev(0..pow) {
ss = ss * arg + coef[i];
}
ss
}
}
pub mod scl_sv {
#[derive(Debug)]
pub struct SclSv {
pub s: f64,
pub v: f64,
}
impl SclSv {}
pub fn scale(ss: f64, a: &SclSv) -> SclSv {
SclSv {
s: (ss * a.s),
v: (ss * a.v),
}
}
pub fn scale2(ss: f64, sv: f64, a: &SclSv) -> SclSv {
SclSv {
s: (ss * a.s),
v: (sv * a.v),
}
}
pub fn add(a: &SclSv, b: &SclSv) -> SclSv {
SclSv {
s: (a.s + b.s),
v: (a.v + b.v),
}
}
pub fn sub(a: &SclSv, b: &SclSv) -> SclSv {
SclSv {
s: (a.s - b.s),
v: (a.v - b.v),
}
}
pub fn mul(a: &SclSv, b: &SclSv) -> SclSv {
SclSv {
s: (a.s * b.s),
v: (b.s * a.v + a.s * b.v),
}
}
pub fn div(a: &SclSv, b: &SclSv) -> SclSv {
SclSv {
s: (a.s / b.s),
v: ((a.v * b.s - a.s * b.v) / (b.s * b.s)),
}
}
pub fn polynom(arg: f64, coef: &[f64]) -> SclSv {
let pow = coef.len() - 1;
let mut ss = coef[pow];
let mut sv = pow as f64 * coef[pow];
for i in Iterator::rev(0..pow) {
ss = ss * arg + coef[i];
}
for i in Iterator::rev(1..pow) {
sv = sv * arg + i as f64 * coef[i];
}
SclSv { s: (ss), v: (sv) }
}
pub fn poly_norm(arg: f64, coef: &[f64], norm: f64) -> SclSv {
let pow = coef.len() - 1;
let mut ss = coef[pow];
let mut sv = pow as f64 * coef[pow];
for i in Iterator::rev(0..pow) {
ss = ss * arg + coef[i];
}
for i in Iterator::rev(1..pow) {
sv = sv * arg + i as f64 * coef[i];
}
SclSv {
s: (ss) % norm,
v: (sv),
}
}
pub fn update(t0: f64, sv0: &SclSv, t: f64) -> SclSv {
let dt = t - t0;
SclSv {
s: (sv0.s + dt * sv0.v),
v: (sv0.v),
}
}
pub fn interp(t0: f64, sv0: &SclSv, t1: f64, sv1: &SclSv, t: f64) -> SclSv {
let dt = t - t0;
let acc = (sv1.v - sv0.v) / (t1 - t0);
SclSv {
s: (sv0.s + dt * (sv0.v + 0.5 * dt * acc)),
v: (sv0.v + dt * acc),
}
}
}
pub mod scl_sva {
#[derive(Debug)]
pub struct SclSva {
pub s: f64,
pub v: f64,
pub a: f64,
}
impl SclSva {}
pub fn scale(ss: f64, a: &SclSva) -> SclSva {
SclSva {
s: (ss * a.s),
v: (ss * a.v),
a: (ss * a.a),
}
}
pub fn scale_other(ss: f64, sv: f64, sa: f64, a: &SclSva) -> SclSva {
SclSva {
s: (ss * a.s),
v: (sv * a.v),
a: (sa * a.a),
}
}
pub fn add(a: &SclSva, b: &SclSva) -> SclSva {
SclSva {
s: (a.s + b.s),
v: (a.v + b.v),
a: (a.a + b.a),
}
}
pub fn sub(a: &SclSva, b: &SclSva) -> SclSva {
SclSva {
s: (a.s - b.s),
v: (a.v - b.v),
a: (a.a - b.a),
}
}
pub fn mul(a: &SclSva, b: &SclSva) -> SclSva {
SclSva {
s: (a.s * b.s),
v: (b.s * a.v + a.s * b.v),
a: (2.0 * b.v * a.v + b.s * a.a + a.s * b.a),
}
}
pub fn div(a: &SclSva, b: &SclSva) -> SclSva {
let del = 1.0 / b.s;
SclSva {
s: (a.s / b.s),
v: ((a.v - a.s * b.v * del) * del),
a: ((a.a + ((-a.s * b.a - 2.0 * a.v * b.v) + 2.0 * a.s * b.v * b.v * del) * del) * del),
}
}
pub fn polynom(arg: f64, coef: &[f64]) -> SclSva {
let pow = coef.len() - 1;
let mut ss = coef[pow];
let mut sv = pow as f64 * coef[pow];
let mut sa = (pow * (pow - 1)) as f64 * coef[pow]; for i in Iterator::rev(0..pow) {
ss = ss * arg + coef[i];
}
for i in Iterator::rev(1..pow) {
sv = sv * arg + i as f64 * coef[i];
}
for i in Iterator::rev(2..pow) {
sa = sa * arg + (i * (i - 1)) as f64 * coef[i];
}
SclSva {
s: (ss),
v: (sv),
a: (sa),
}
}
pub fn update(t0: f64, sva0: &SclSva, t: f64) -> SclSva {
let dt = t - t0;
SclSva {
s: (sva0.s + dt * (sva0.v + 0.5 * dt * sva0.a)),
v: (sva0.v + dt * sva0.a),
a: (sva0.a),
}
}
pub fn interp(t0: f64, sva0: &SclSva, t1: f64, sva1: &SclSva, t: f64) -> SclSva {
let dt = t - t0;
let acc = (sva1.a - sva0.a) / (t1 - t0);
SclSva {
s: (sva0.s + dt * (sva0.v + dt * (0.5 * sva0.a + dt * acc / 6.0))),
v: (sva0.v + dt * (sva0.a + 0.5 * dt * acc)),
a: (sva0.a + dt * acc),
}
}
}