ode_base/ode/
mat.rs

1//! mat
2//!
3
4use crate::ode::*;
5
6use std::fmt;
7
8/// mat as slice
9#[derive(Debug)]
10pub struct ODEMat<'a> {
11  nr: usize,
12  nc: usize,
13  mat: &'a [dReal]
14}
15
16/// mat as slice
17impl ODEMat<'_> {
18  /// construct
19  pub fn from_slice(nr: usize, nc: usize, mat: &[dReal]) -> ODEMat {
20    ODEMat{nr: nr, nc: nc, mat: mat}
21  }
22
23  /// construct
24  pub fn as_vec(mat: &[dReal]) -> ODEMat {
25    ODEMat::from_slice(1, 4, mat)
26  }
27
28  /// construct
29  pub fn as_mat(nr: usize, mat: &[dReal]) -> ODEMat {
30    ODEMat::from_slice(nr, 4, mat)
31  }
32
33  /// construct
34  pub fn from_Q(q: *const dReal) -> ODEMat<'static> {
35unsafe {
36    ODEMat::as_vec(std::slice::from_raw_parts(q, 4))
37}
38  }
39
40  /// construct
41  pub fn from_Mat3(m: *const dReal) -> ODEMat<'static> {
42unsafe {
43    ODEMat::as_mat(3, std::slice::from_raw_parts(m, 12))
44}
45  }
46
47  /// construct
48  pub fn from_Mat4(m: *const dReal) -> ODEMat<'static> {
49unsafe {
50    ODEMat::as_mat(4, std::slice::from_raw_parts(m, 16))
51}
52  }
53}
54
55/// mat formatter
56impl fmt::Display for ODEMat<'_> {
57  /// mat formatter
58  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59    match self.nr {
60      1 => {
61        write!(f, "[");
62        for (j, col) in self.mat.iter().enumerate() {
63          if j != 0 { write!(f, ","); }
64          write!(f, "{:17.7}", col);
65        }
66        write!(f, "]")
67      },
68      _ => {
69        writeln!(f, "[");
70        for (i, row) in self.mat.chunks_exact(self.nc).enumerate() {
71          write!(f, " {}", ODEMat::as_vec(row));
72          if i < self.nr - 1 { writeln!(f, ""); };
73        }
74        write!(f, "]")
75      }
76    }
77  }
78}
79
80// std::convert::TryInto
81/// construct array [T; N] (dVector3 dMatrix3 etc) from vec![]
82pub fn v2a<T, const N: usize>(v: Vec<T>) -> [T; N] {
83  v.try_into().unwrap_or_else(|v: Vec<T>|
84    panic!("Expected a Vec of length {} but it was {}", N, v.len()))
85}