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() == 2, "vector must be of size 2");
12 };
13}
14
15pub fn scale2(v: &Vector<f32>, dx: f32, dy: f32) -> Vector<f32> {
16 size!(v);
17 M!([[dx, 0.], [0., dy]]) * v
18}
19
20pub fn shear2x(v: &Vector<f32>, s: f32) -> Vector<f32> {
21 size!(v);
22 M!([[1., s], [0., 1.]]) * v
23}
24
25pub fn shear2y(v: &Vector<f32>, s: f32) -> Vector<f32> {
26 size!(v);
27 M!([[1., 0.], [s, 1.]]) * v
28}
29
30pub fn rotate2(v: &Vector<f32>, deg: f32) -> Vector<f32> {
31 size!(v);
32 M!([[deg.cos(), -deg.sin()], [deg.sin(), deg.cos()]]) * v
33}
34
35pub fn reflect2x(v: &Vector<f32>) -> Vector<f32> {
36 size!(v);
37 M!([[1., 0.], [0., -1.]]) * v
38}
39
40pub fn reflect2y(v: &Vector<f32>) -> Vector<f32> {
41 size!(v);
42 M!([[-1., 0.], [0., 1.]]) * v
43}