From 4edbecaf81ef2bde1a3827ecb64de2bb2539f486 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 16 Dec 2019 03:33:41 +0100 Subject: [PATCH] Add a way to merge an iterator of transformation matrices --- fractional/src/main.rs | 51 +++++++++++++++++-------------------- fractional/src/transform.rs | 16 ++++++++++++ 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/fractional/src/main.rs b/fractional/src/main.rs index 9f2222f..8c358a9 100644 --- a/fractional/src/main.rs +++ b/fractional/src/main.rs @@ -29,7 +29,7 @@ use fractional::continuous::Continuous; use fractional::fractional::{Fractional, from_vector}; use fractional::trigonometry::Trig; use fractional::vector::{Vector}; -use fractional::transform::{translate, rotate_x, rotate_y, rotate_z, rotate_v}; +use fractional::transform::{TMatrix, translate, rotate_x, rotate_y, rotate_z, rotate_v}; // Tail recursive Bresenham line with integer incremental error. fn line(a :(u32, u32), b :(u32, u32)) -> Vec<(u32, u32)>{ @@ -228,47 +228,42 @@ fn _transform(v :Vector, v1 :Vector, v2 :Vector, v3 :Vector) where T: Add + Sub + Neg + Mul + Div + Trig + From + Copy + Display { - let mt = translate(v); println!("{:>14} : {}", "Vector v1", v1); - println!("{:>14} : {}", "translate v1", mt.apply(&v1)); + println!("{:>14} : {}", "translate v1", translate(v).apply(&v1)); println!(); - println!("{:>14} : {}", "Vector v2", v2); - for d in [ 30, 45, 60, 90, 120, 135, 150, 180 - , 210, 225, 240, 270, 300, 315, 330 ].iter() { - let m = rotate_x(*d as i32); - println!("{:>14} : {}", format!("rot_x {} v2", d), m.apply(&v2)); + fn _rot( o :&str , n :&str , v :&Vector + , fs :&[&dyn Fn(i32) -> TMatrix] ) + where T: Add + Sub + Neg + + Mul + Div + Trig + + From + Copy + Display { + + for d in [ 30, 45, 60, 90, 120, 135, 150, 180 + , 210, 225, 240, 270, 300, 315, 330 ].iter() { + let mi = fs.iter().map(|f| f(*d as i32)); + println!( "{:>14} : {}" + , format!("{} {} {}", o, d, n) + , TMatrix::combine(mi).apply(v) ); + } } - println!(); println!("{:>14} : {}", "Vector v2", v2); - for d in [ 30, 45, 60, 90, 120, 135, 150, 180 - , 210, 225, 240, 270, 300, 315, 330 ].iter() { - let m = rotate_y(*d as i32); - println!("{:>14} : {}", format!("rot_y {} v2", d), m.apply(&v2)); - } + _rot("rot_x", "v2", &v2, &[&rotate_x]); println!(); - - for d in [ 30, 45, 60, 90, 120, 135, 150, 180 - , 210, 225, 240, 270, 300, 315, 330 ].iter() { - let m = rotate_x(*d as i32) * rotate_y(*d as i32); - println!("{:>14} : {}", format!("rot_xy {} v2", d), m.apply(&v2)); - } + _rot("rot_y", "v2", &v2, &[&rotate_y]); + println!(); + _rot("rot_xy", "v2", &v2, &[&rotate_x, &rotate_y]); println!(); - println!("{:>14} : {}", "Vector v3", v3); - for d in [ 30, 45, 60, 90, 120, 135, 150, 180 - , 210, 225, 240, 270, 300, 315, 330 ].iter() { - let m = rotate_z(*d as i32); - println!("{:>14} : {}", format!("rot_z {} v3", d), m.apply(&v3)); - } + _rot("rot_z", "v3", &v3, &[&rotate_z]); println!(); for d in [ 30, 45, 60, 90, 120, 135, 150, 180 , 210, 225, 240, 270, 300, 315, 330 ].iter() { - let m = rotate_v(&v, *d as i32); - println!("{:>14} : {}", format!("rot_v {} v2", d), m.apply(&v2)); + println!( "{:>14} : {}" + , format!("rot_v {} v2", d) + , rotate_v(&v, *d as i32).apply(&v2)); } } diff --git a/fractional/src/transform.rs b/fractional/src/transform.rs index 591c383..4ea2a9a 100644 --- a/fractional/src/transform.rs +++ b/fractional/src/transform.rs @@ -19,15 +19,25 @@ // along with this program. If not, see . // use std::ops::{Add, Sub, Neg, Mul, Div}; + use crate::Vector; use crate::trigonometry::Trig; +#[derive(Debug, Clone, Copy)] pub struct TMatrix( (T, T, T, T) , (T, T, T, T) , (T, T, T, T) , (T, T, T, T) ) where T: Add + Sub + Neg + Mul + Div + Trig + From + Copy; +pub fn unit() -> TMatrix +where T: Add + Sub + Neg + + Mul + Div + Trig + From + Copy { + TMatrix( (1.into(), 0.into(), 0.into(), 0.into()) + , (0.into(), 1.into(), 0.into(), 0.into()) + , (0.into(), 0.into(), 1.into(), 0.into()) + , (0.into(), 0.into(), 0.into(), 1.into()) ) +} pub fn translate(v :Vector) -> TMatrix where T: Add + Sub + Neg + Mul + Div + Trig + From + Copy { @@ -115,6 +125,12 @@ where T: Add + Sub + Neg impl TMatrix where T: Add + Sub + Neg + Mul + Div + Trig + From + Copy { + pub fn combine(mi :I) -> TMatrix + where I: IntoIterator> { + + mi.into_iter().fold(unit(), |acc, x| acc * x) + } + pub fn apply(&self, v :&Vector) -> Vector { let TMatrix( (a11, a12, a13, a14) , (a21, a22, a23, a24)