use crate::{FloatOps, Mat3, Vec2};
use num::traits::NumAssign;
pub fn translation<T: Copy + NumAssign>(v: Vec2<T>) -> Mat3<T> {
let mut result = Mat3::identity();
result[(0, 2)] = v[0];
result[(1, 2)] = v[1];
result
}
pub fn scaling<T: Copy + NumAssign>(v: Vec2<T>) -> Mat3<T> {
let mut result = Mat3::identity();
result[(0, 0)] = v[0];
result[(1, 1)] = v[1];
result
}
#[inline]
pub fn rotation<T: Copy + FloatOps + NumAssign>(theta: T) -> Mat3<T> {
let mut result = Mat3::identity();
let cos_theta = theta.cos();
let sin_theta = theta.sin();
result[(0, 0)] = cos_theta;
result[(1, 0)] = sin_theta;
result[(0, 1)] = T::zero() - sin_theta;
result[(1, 1)] = cos_theta;
result
}
pub fn transformation<T: Copy + FloatOps + NumAssign>(
translation: Vec2<T>,
rotation_angle: T,
scaling: Vec2<T>,
) -> Mat3<T> {
let mut result: Mat3<T> = rotation(rotation_angle);
for c in 0..2 {
for r in 0..2 {
result[(r, c)] *= scaling[c];
}
}
result[(0, 2)] = translation[0];
result[(1, 2)] = translation[1];
result
}