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
use number_traits::{Num, Signed, Trig}; #[inline] pub fn set_rotation<'a, 'b, T: Copy + Signed + Trig>( out: &'a mut [T; 4], angle: T, ) -> &'a mut [T; 4] { let c = angle.cos(); let s = angle.sin(); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; out } #[test] fn test_set_rotation() { use core::f32; use create; use misc; let mut m = create::new_identity::<f32>(); set_rotation(&mut m, f32::consts::FRAC_PI_2); assert!(misc::eq(&m, &[0f32, 1f32, -1f32, 0f32])); } #[inline] pub fn get_rotation<'a, 'b, T: Copy + Num + Trig>(out: &'b [T; 4]) -> T { out[1].atan2(&out[0]) } #[test] fn test_get_rotation() { use core::f32; use create; let mut m = create::new_identity::<f32>(); set_rotation(&mut m, f32::consts::FRAC_PI_2); assert_eq!(get_rotation(&m), f32::consts::FRAC_PI_2); } #[inline] pub fn rotate<'a, 'b, T: Copy + Signed + Trig>( out: &'a mut [T; 4], a: &'b [T; 4], angle: T, ) -> &'a mut [T; 4] { let m11 = a[0]; let m12 = a[2]; let m21 = a[1]; let m22 = a[3]; let c = angle.cos(); let s = angle.sin(); out[0] = m11 * c + m12 * -s; out[1] = m11 * s + m12 * c; out[2] = m21 * c + m22 * -s; out[3] = m21 * s + m22 * c; out } #[test] fn test_rotate() { use core::f32; use create; use misc; let mut m = create::new_identity::<f32>(); rotate( &mut m, &create::new_identity::<f32>(), f32::consts::FRAC_PI_2, ); assert!(misc::eq(&m, &[0f32, 1f32, -1f32, 0f32])); }