1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
extern crate nalgebra as na;
use self::na::{Matrix3, Vector3};
use std::f64;
pub fn tilde_matrix(v: &Vector3<f64>) -> Matrix3<f64> {
Matrix3::new(
0.0,
-v[(2, 0)],
v[(1, 0)],
v[(2, 0)],
0.0,
-v[(0, 0)],
-v[(1, 0)],
v[(0, 0)],
0.0,
)
}
pub fn is_diagonal(m: &Matrix3<f64>) -> bool {
for i in 1..2 {
for j in 0..i {
if (i == j && (m[(i, j)] - m[(0, 0)]) > f64::EPSILON)
|| (i != j && (m[(i, j)].abs() > f64::EPSILON || (m[(i, j)] - m[(j, i)]).abs() > f64::EPSILON))
{
return false;
}
}
}
true
}
pub fn between_0_360(angle: f64) -> f64 {
let mut bounded = angle;
while bounded > 360.0 {
bounded -= 360.0;
}
while bounded < 0.0 {
bounded += 360.0;
}
bounded
}
pub fn between_pm_180(angle: f64) -> f64 {
let mut bounded = angle;
while bounded > 180.0 {
bounded -= 360.0;
}
while bounded < -180.0 {
bounded += 360.0;
}
bounded
}
pub fn factorial(num: f64) -> f64 {
if num <= f64::EPSILON || (num - 1.0).abs() <= f64::EPSILON {
1.0
} else {
num * factorial(num - 1.0)
}
}
pub fn kronecker(a: f64, b: f64) -> f64 {
if (a - b).abs() <= f64::EPSILON {
1.0
} else {
0.0
}
}
pub fn r1(angle: f64) -> Matrix3<f64> {
let (s, c) = angle.sin_cos();
Matrix3::new(1.0, 0.0, 0.0, 0.0, c, s, 0.0, -s, c)
}
pub fn r2(angle: f64) -> Matrix3<f64> {
let (s, c) = angle.sin_cos();
Matrix3::new(c, 0.0, -s, 0.0, 1.0, 0.0, s, 0.0, c)
}
pub fn r3(angle: f64) -> Matrix3<f64> {
let (s, c) = angle.sin_cos();
Matrix3::new(c, s, 0.0, -s, c, 0.0, 0.0, 0.0, 1.0)
}