Browse Source

Add a way to merge an iterator of transformation matrices

master
Georg Hopp 6 years ago
parent
commit
4edbecaf81
Signed by: ghopp GPG Key ID: 4C5D226768784538
  1. 51
      fractional/src/main.rs
  2. 16
      fractional/src/transform.rs

51
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<T>(v :Vector<T>, v1 :Vector<T>, v2 :Vector<T>, v3 :Vector<T>)
where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
+ Mul<Output = T> + Div<Output = T> + Trig
+ From<i32> + 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<T>( o :&str , n :&str , v :&Vector<T>
, fs :&[&dyn Fn(i32) -> TMatrix<T>] )
where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
+ Mul<Output = T> + Div<Output = T> + Trig
+ From<i32> + 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));
}
}

16
fractional/src/transform.rs

@ -19,15 +19,25 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
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, T) )
where T: Add + Sub + Neg + Mul + Div + Trig + From<i32> + Copy;
pub fn unit<T>() -> TMatrix<T>
where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
+ Mul<Output = T> + Div<Output = T> + Trig + From<i32> + 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<T>(v :Vector<T>) -> TMatrix<T>
where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
+ Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy {
@ -115,6 +125,12 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
impl<T> TMatrix<T>
where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
+ Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy {
pub fn combine<I>(mi :I) -> TMatrix<T>
where I: IntoIterator<Item = TMatrix<T>> {
mi.into_iter().fold(unit(), |acc, x| acc * x)
}
pub fn apply(&self, v :&Vector<T>) -> Vector<T> {
let TMatrix( (a11, a12, a13, a14)
, (a21, a22, a23, a24)

Loading…
Cancel
Save