1use crate::{Matrix, Vector};
2
3macro_rules! M {
4 ($values:expr) => {
5 &Matrix::from($values)
6 };
7}
8
9macro_rules! size {
10 ($vec:expr) => {
11 assert!($vec.size() == 3, "vector must be of size 3");
12 };
13}
14
15pub fn scale3(v: &Vector<f32>, dx: f32, dy: f32, dz: f32) -> Vector<f32> {
16 size!(v);
17 M!([[dx, 0., 0.], [0., dy, 0.], [0., 0., dz]]) * v
18}
19
20pub fn rotate3x(v: &Vector<f32>, deg: f32) -> Vector<f32> {
21 size!(v);
22 M!([
23 [1., 0., 0.],
24 [0., deg.cos(), -deg.sin()],
25 [0., deg.sin(), deg.cos()]
26 ]) * v
27}
28
29pub fn rotate3y(v: &Vector<f32>, deg: f32) -> Vector<f32> {
30 size!(v);
31 M!([
32 [deg.cos(), 0., deg.sin()],
33 [0., 1., 0.],
34 [-deg.sin(), 0., deg.cos()]
35 ]) * v
36}
37
38pub fn rotate3z(v: &Vector<f32>, deg: f32) -> Vector<f32> {
39 size!(v);
40 M!([
41 [deg.cos(), -deg.sin(), 0.],
42 [deg.sin(), deg.cos(), 0.],
43 [0., 0., 1.]
44 ]) * v
45}