From c1655b4efb01e6522771fb337c85eb8dc6a3a784 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Tue, 31 Dec 2019 16:40:41 +0100 Subject: [PATCH] Correct transformation matrix handling --- fractional/src/transform.rs | 58 ++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/fractional/src/transform.rs b/fractional/src/transform.rs index 4ea2a9a..5bfd28e 100644 --- a/fractional/src/transform.rs +++ b/fractional/src/transform.rs @@ -19,6 +19,7 @@ // along with this program. If not, see . // use std::ops::{Add, Sub, Neg, Mul, Div}; +use std::fmt::Debug; use crate::Vector; use crate::trigonometry::Trig; @@ -28,30 +29,34 @@ 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; + where T: Add + Sub + Neg + Mul + Div + Debug + Trig + From + Copy; pub fn unit() -> TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + 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 { - let Vector(x, y, z) = v; + + Mul + Div + + Debug + Trig + From + Copy { + let Vector(x, y, z) = v; - 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()) - , ( x, y, z, 1.into()) ) + TMatrix( (1.into(), 0.into(), 0.into(), x) + , (0.into(), 1.into(), 0.into(), y) + , (0.into(), 0.into(), 1.into(), z) + , (0.into(), 0.into(), 0.into(), 1.into()) ) } pub fn rotate_x(a :i32) -> TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { let sin :T = Trig::sin(a); let cos :T = Trig::cos(a); @@ -63,7 +68,8 @@ where T: Add + Sub + Neg pub fn rotate_y(a :i32) -> TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { let sin :T = Trig::sin(a); let cos :T = Trig::cos(a); @@ -75,7 +81,8 @@ where T: Add + Sub + Neg pub fn rotate_z(a :i32) -> TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { let sin :T = Trig::sin(a); let cos :T = Trig::cos(a); @@ -87,7 +94,8 @@ where T: Add + Sub + Neg pub fn rotate_v(v :&Vector, a :i32) -> TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { let Vector(x, y, z) = *v; let sin :T = Trig::sin(a); @@ -113,7 +121,8 @@ where T: Add + Sub + Neg pub fn scale(v :Vector) -> TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { let Vector(x, y, z) = v; TMatrix( ( x, 0.into(), 0.into(), 0.into()) @@ -124,11 +133,19 @@ where T: Add + Sub + Neg impl TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { + pub fn new( r1 :(T, T, T, T) + , r2 :(T, T, T, T) + , r3 :(T, T, T, T) + , r4 :(T, T, T, T) ) -> TMatrix { + TMatrix(r1, r2, r3, r4) + } + pub fn combine(mi :I) -> TMatrix where I: IntoIterator> { - mi.into_iter().fold(unit(), |acc, x| acc * x) + mi.into_iter().fold(unit(), |acc, x| x * acc) } pub fn apply(&self, v :&Vector) -> Vector { @@ -138,10 +155,10 @@ where T: Add + Sub + Neg , (a41, a42, a43, a44) ) = *self; let Vector(x, y, z) = *v; - let v = Vector( a11 * x + a21 * y + a31 * z + a41 - , a12 * x + a22 * y + a32 * z + a42 - , a13 * x + a23 * y + a33 * z + a43 ); - let w = a14 * x + a24 * y + a34 * z + a44; + let v = Vector( a11 * x + a12 * y + a13 * z + a14 + , a21 * x + a22 * y + a23 * z + a24 + , a31 * x + a32 * y + a33 * z + a34 ); + let w = a41 * x + a42 * y + a43 * z + a44; v.mul(&w.recip()) } @@ -149,7 +166,8 @@ where T: Add + Sub + Neg impl Mul for TMatrix where T: Add + Sub + Neg - + Mul + Div + Trig + From + Copy { + + Mul + Div + + Debug + Trig + From + Copy { type Output = Self; // ATTENTION: This is not commutative, nor assoziative.