Commit 6fd0ac65e9152e40742b14f8240d350cb43ea621

Authored by Georg Hopp
1 parent 18da9a08

Make TMatrix constructors part of the implementation

... ... @@ -33,8 +33,8 @@ use fractional::easel::{ Coordinate, Coordinates, Drawable, Line, Polyline
33 33 , Polygon, Rectangle};
34 34 use fractional::fractional::{Fractional, from_vector};
35 35 use fractional::trigonometry::Trig;
36   -use fractional::vector::{Vector};
37   -use fractional::transform::{TMatrix, translate, rotate_x, rotate_y, rotate_z, rotate_v};
  36 +use fractional::vector::Vector;
  37 +use fractional::transform::TMatrix;
38 38
39 39 use fractional::xcb::XcbEasel;
40 40 use fractional::easel::Canvas;
... ... @@ -204,7 +204,7 @@ fn _transform<T>(v :Vector<T>, v1 :Vector<T>, v2 :Vector<T>, v3 :Vector<T>)
204 204 + Debug + From<i32> + Copy + Display {
205 205
206 206 println!("{:>14} : {}", "Vector v1", v1);
207   - println!("{:>14} : {}", "translate v1", translate(v).apply(&v1));
  207 + println!("{:>14} : {}", "translate v1", TMatrix::translate(v).apply(&v1));
208 208 println!();
209 209
210 210 fn _rot<T>( o :&str , n :&str , v :&Vector<T>
... ... @@ -223,21 +223,21 @@ fn _transform<T>(v :Vector<T>, v1 :Vector<T>, v2 :Vector<T>, v3 :Vector<T>)
223 223 }
224 224
225 225 println!("{:>14} : {}", "Vector v2", v2);
226   - _rot("rot_x", "v2", &v2, &[&rotate_x]);
  226 + _rot("rot_x", "v2", &v2, &[&TMatrix::rotate_x]);
227 227 println!();
228   - _rot("rot_y", "v2", &v2, &[&rotate_y]);
  228 + _rot("rot_y", "v2", &v2, &[&TMatrix::rotate_y]);
229 229 println!();
230   - _rot("rot_xy", "v2", &v2, &[&rotate_x, &rotate_y]);
  230 + _rot("rot_xy", "v2", &v2, &[&TMatrix::rotate_x, &TMatrix::rotate_y]);
231 231 println!();
232 232 println!("{:>14} : {}", "Vector v3", v3);
233   - _rot("rot_z", "v3", &v3, &[&rotate_z]);
  233 + _rot("rot_z", "v3", &v3, &[&TMatrix::rotate_z]);
234 234 println!();
235 235
236 236 for d in [ 30, 45, 60, 90, 120, 135, 150, 180
237 237 , 210, 225, 240, 270, 300, 315, 330 ].iter() {
238 238 println!( "{:>14} : {}"
239 239 , format!("rot_v {} v2", d)
240   - , rotate_v(&v, *d as i32).apply(&v2));
  240 + , TMatrix::rotate_v(&v, *d as i32).apply(&v2));
241 241 }
242 242 }
243 243
... ... @@ -272,7 +272,7 @@ fn _line() {
272 272 let j = Vector(Fractional( 30,1), Fractional( 30,1), Fractional(0,1));
273 273 let k = Vector(Fractional(-30,1), Fractional( 30,1), Fractional(0,1));
274 274
275   - let rot :TMatrix<Fractional> = rotate_z(20);
  275 + let rot :TMatrix<Fractional> = TMatrix::rotate_z(20);
276 276 let Vector(ix, iy, _) = rot.apply(&i);
277 277 let Vector(jx, jy, _) = rot.apply(&j);
278 278 let Vector(kx, ky, _) = rot.apply(&k);
... ... @@ -293,7 +293,7 @@ fn _line() {
293 293 let j = Vector( 30.0, 30.0, 0.0);
294 294 let k = Vector(-30.0, 30.0, 0.0);
295 295
296   - let rot :TMatrix<f64> = rotate_z(20);
  296 + let rot :TMatrix<f64> = TMatrix::rotate_z(20);
297 297 let Vector(ix, iy, _) = rot.apply(&i);
298 298 let Vector(jx, jy, _) = rot.apply(&j);
299 299 let Vector(kx, ky, _) = rot.apply(&k);
... ... @@ -334,22 +334,26 @@ fn _democanvas<T>( xcb :&XcbEasel
334 334 let step = Duration::from_millis(25);
335 335 let mut last = Instant::now();
336 336
337   - let t :TMatrix<T> = translate(Vector(0.into(), 0.into(), 150.into()));
  337 + let t :TMatrix<T> = TMatrix::translate(Vector( 0.into()
  338 + , 0.into()
  339 + , 150.into() ));
338 340 // We do not need this here… it is used within projection…
339 341 // let p :TMatrix<T> = camera.get_projection();
340 342
341 343 loop {
342 344 let deg = ((start.elapsed() / 25).as_millis() % 360) as i32;
343 345
344   - let rz :TMatrix<T> = rotate_z(deg);
  346 + let rz :TMatrix<T> = TMatrix::rotate_z(deg);
  347 + let rx :TMatrix<T> = TMatrix::rotate_x(-deg*2);
  348 + let ry :TMatrix<T> = TMatrix::rotate_y(-deg*2);
345 349
346 350 // I can not apply the projection in one turn, as I generate the
347 351 // normals always… and this is no longer possible after the
348 352 // projection…
349   - // let rot1 = TMatrix::combine(vec!(rz, rotate_x(-deg*2), t, p));
350   - // let rot2 = TMatrix::combine(vec!(rz, rotate_y(-deg*2), t, p));
351   - let rot1 = TMatrix::combine(vec!(rz, rotate_x(-deg*2), t));
352   - let rot2 = TMatrix::combine(vec!(rz, rotate_y(-deg*2), t));
  353 + // let rot1 = TMatrix::combine(vec!(rz, rx, t, p));
  354 + // let rot2 = TMatrix::combine(vec!(rz, ry, t, p));
  355 + let rot1 = TMatrix::combine(vec!(rz, rx, t));
  356 + let rot2 = TMatrix::combine(vec!(rz, ry, t));
353 357
354 358 let objects = vec!( (tetrahedron.transform(&rot1), 0xFFFF00)
355 359 , ( cube.transform(&rot2), 0x0000FF) );
... ... @@ -410,16 +414,18 @@ fn main() {
410 414
411 415 _democanvas( &xcb, "Something...(f64)", tx.clone()
412 416 , Polyeder::triangle(60.0)
413   - , Polyeder::tetrahedron(60.0)
414   - , Polyeder::cube(60.0)
  417 + , Polyeder::tetrahedron(80.0)
  418 + , Polyeder::cube(55.0)
415 419 , DirectLight::new(Vector(0.0, 0.0, 1.0)) );
  420 + /*
416 421 _democanvas( &xcb, "Something...(Fractional)", tx.clone()
417 422 , Polyeder::triangle(Fractional(60,1))
418   - , Polyeder::tetrahedron(Fractional(60,1))
419   - , Polyeder::cube(Fractional(60,1))
  423 + , Polyeder::tetrahedron(Fractional(80,1))
  424 + , Polyeder::cube(Fractional(55,1))
420 425 , DirectLight::new(Vector( Fractional(0,1)
421 426 , Fractional(0,1)
422 427 , Fractional(1,1) )) );
  428 + */
423 429
424 430 for x in rx {
425 431 match x {
... ...
... ... @@ -31,121 +31,100 @@ pub struct TMatrix<T>( (T, T, T, T)
31 31 , (T, T, T, T) )
32 32 where T: Add + Sub + Neg + Mul + Div + Debug + Trig + From<i32> + Copy;
33 33
34   -pub fn unit<T>() -> TMatrix<T>
  34 +impl<T> TMatrix<T>
35 35 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
36 36 + Mul<Output = T> + Div<Output = T>
37 37 + Debug + Trig + From<i32> + Copy {
38   - TMatrix( (1.into(), 0.into(), 0.into(), 0.into())
39   - , (0.into(), 1.into(), 0.into(), 0.into())
40   - , (0.into(), 0.into(), 1.into(), 0.into())
41   - , (0.into(), 0.into(), 0.into(), 1.into()) )
42   -}
  38 + pub fn new( r1 :(T, T, T, T)
  39 + , r2 :(T, T, T, T)
  40 + , r3 :(T, T, T, T)
  41 + , r4 :(T, T, T, T) ) -> Self {
  42 + TMatrix(r1, r2, r3, r4)
  43 + }
43 44
44   -pub fn translate<T>(v :Vector<T>) -> TMatrix<T>
45   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
46   - + Mul<Output = T> + Div<Output = T>
47   - + Debug + Trig + From<i32> + Copy {
48   - let Vector(x, y, z) = v;
  45 + pub fn unit() -> Self {
  46 + Self::new( (1.into(), 0.into(), 0.into(), 0.into())
  47 + , (0.into(), 1.into(), 0.into(), 0.into())
  48 + , (0.into(), 0.into(), 1.into(), 0.into())
  49 + , (0.into(), 0.into(), 0.into(), 1.into()) )
  50 + }
49 51
50   - TMatrix( (1.into(), 0.into(), 0.into(), x)
51   - , (0.into(), 1.into(), 0.into(), y)
52   - , (0.into(), 0.into(), 1.into(), z)
53   - , (0.into(), 0.into(), 0.into(), 1.into()) )
54   -}
  52 + pub fn translate(v :Vector<T>) -> Self {
  53 + let Vector(x, y, z) = v;
55 54
56   -pub fn rotate_x<T>(a :i32) -> TMatrix<T>
57   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
58   - + Mul<Output = T> + Div<Output = T>
59   - + Debug + Trig + From<i32> + Copy {
60   - let sin :T = Trig::sin(a);
61   - let cos :T = Trig::cos(a);
  55 + Self::new( (1.into(), 0.into(), 0.into(), x)
  56 + , (0.into(), 1.into(), 0.into(), y)
  57 + , (0.into(), 0.into(), 1.into(), z)
  58 + , (0.into(), 0.into(), 0.into(), 1.into()) )
  59 + }
62 60
63   - TMatrix( (1.into(), 0.into(), 0.into(), 0.into())
64   - , (0.into(), cos , -sin , 0.into())
65   - , (0.into(), sin , cos , 0.into())
66   - , (0.into(), 0.into(), 0.into(), 1.into()) )
67   -}
  61 + pub fn rotate_x(a :i32) -> Self {
  62 + let sin :T = Trig::sin(a);
  63 + let cos :T = Trig::cos(a);
68 64
69   -pub fn rotate_y<T>(a :i32) -> TMatrix<T>
70   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
71   - + Mul<Output = T> + Div<Output = T>
72   - + Debug + Trig + From<i32> + Copy {
73   - let sin :T = Trig::sin(a);
74   - let cos :T = Trig::cos(a);
  65 + Self::new( (1.into(), 0.into(), 0.into(), 0.into())
  66 + , (0.into(), cos , -sin , 0.into())
  67 + , (0.into(), sin , cos , 0.into())
  68 + , (0.into(), 0.into(), 0.into(), 1.into()) )
  69 + }
75 70
76   - TMatrix( (cos , 0.into(), sin , 0.into())
77   - , (0.into(), 1.into(), 0.into(), 0.into())
78   - , (-sin , 0.into(), cos , 0.into())
79   - , (0.into(), 0.into(), 0.into(), 1.into()) )
80   -}
  71 + pub fn rotate_y(a :i32) -> Self {
  72 + let sin :T = Trig::sin(a);
  73 + let cos :T = Trig::cos(a);
81 74
82   -pub fn rotate_z<T>(a :i32) -> TMatrix<T>
83   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
84   - + Mul<Output = T> + Div<Output = T>
85   - + Debug + Trig + From<i32> + Copy {
86   - let sin :T = Trig::sin(a);
87   - let cos :T = Trig::cos(a);
  75 + Self::new( (cos , 0.into(), sin , 0.into())
  76 + , (0.into(), 1.into(), 0.into(), 0.into())
  77 + , (-sin , 0.into(), cos , 0.into())
  78 + , (0.into(), 0.into(), 0.into(), 1.into()) )
  79 + }
88 80
89   - TMatrix( (cos , -sin , 0.into(), 0.into())
90   - , (sin , cos , 0.into(), 0.into())
91   - , (0.into(), 0.into(), 1.into(), 0.into())
92   - , (0.into(), 0.into(), 0.into(), 1.into()) )
93   -}
  81 + pub fn rotate_z(a :i32) -> Self {
  82 + let sin :T = Trig::sin(a);
  83 + let cos :T = Trig::cos(a);
94 84
95   -pub fn rotate_v<T>(v :&Vector<T>, a :i32) -> TMatrix<T>
96   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
97   - + Mul<Output = T> + Div<Output = T>
98   - + Debug + Trig + From<i32> + Copy {
99   - let Vector(x, y, z) = *v;
100   -
101   - let sin :T = Trig::sin(a);
102   - let cos :T = Trig::cos(a);
103   -
104   - let zero :T = 0.into();
105   - let one :T = 1.into();
106   -
107   - TMatrix( ( (one - cos) * x * x + cos
108   - , (one - cos) * x * y - sin * z
109   - , (one - cos) * x * z + sin * y
110   - , zero )
111   - , ( (one - cos) * x * y + sin * z
112   - , (one - cos) * y * y + cos
113   - , (one - cos) * y * z - sin * x
114   - , zero )
115   - , ( (one - cos) * x * z - sin * y
116   - , (one - cos) * y * z + sin * x
117   - , (one - cos) * z * z + cos
118   - , zero )
119   - , (0.into(), 0.into(), 0.into(), 1.into()) )
120   -}
  85 + Self::new( (cos , -sin , 0.into(), 0.into())
  86 + , (sin , cos , 0.into(), 0.into())
  87 + , (0.into(), 0.into(), 1.into(), 0.into())
  88 + , (0.into(), 0.into(), 0.into(), 1.into()) )
  89 + }
121 90
122   -pub fn scale<T>(v :Vector<T>) -> TMatrix<T>
123   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
124   - + Mul<Output = T> + Div<Output = T>
125   - + Debug + Trig + From<i32> + Copy {
126   - let Vector(x, y, z) = v;
  91 + pub fn rotate_v(v :&Vector<T>, a :i32) -> Self {
  92 + let Vector(x, y, z) = *v;
127 93
128   - TMatrix( ( x, 0.into(), 0.into(), 0.into())
129   - , (0.into(), y, 0.into(), 0.into())
130   - , (0.into(), 0.into(), z, 0.into())
131   - , (0.into(), 0.into(), 0.into(), 1.into()) )
132   -}
  94 + let sin :T = Trig::sin(a);
  95 + let cos :T = Trig::cos(a);
  96 +
  97 + let zero :T = 0.into();
  98 + let one :T = 1.into();
  99 +
  100 + Self::new( ( (one - cos) * x * x + cos
  101 + , (one - cos) * x * y - sin * z
  102 + , (one - cos) * x * z + sin * y
  103 + , zero )
  104 + , ( (one - cos) * x * y + sin * z
  105 + , (one - cos) * y * y + cos
  106 + , (one - cos) * y * z - sin * x
  107 + , zero )
  108 + , ( (one - cos) * x * z - sin * y
  109 + , (one - cos) * y * z + sin * x
  110 + , (one - cos) * z * z + cos
  111 + , zero )
  112 + , (0.into(), 0.into(), 0.into(), 1.into()) )
  113 + }
133 114
134   -impl<T> TMatrix<T>
135   -where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
136   - + Mul<Output = T> + Div<Output = T>
137   - + Debug + Trig + From<i32> + Copy {
138   - pub fn new( r1 :(T, T, T, T)
139   - , r2 :(T, T, T, T)
140   - , r3 :(T, T, T, T)
141   - , r4 :(T, T, T, T) ) -> TMatrix<T> {
142   - TMatrix(r1, r2, r3, r4)
  115 + pub fn scale(v :Vector<T>) -> Self {
  116 + let Vector(x, y, z) = v;
  117 +
  118 + Self::new( ( x, 0.into(), 0.into(), 0.into())
  119 + , (0.into(), y, 0.into(), 0.into())
  120 + , (0.into(), 0.into(), z, 0.into())
  121 + , (0.into(), 0.into(), 0.into(), 1.into()) )
143 122 }
144 123
145 124 pub fn combine<I>(mi :I) -> TMatrix<T>
146 125 where I: IntoIterator<Item = TMatrix<T>> {
147 126
148   - mi.into_iter().fold(unit(), |acc, x| x * acc)
  127 + mi.into_iter().fold(Self::unit(), |acc, x| x * acc)
149 128 }
150 129
151 130 pub fn apply(&self, v :&Vector<T>) -> Vector<T> {
... ...
Please register or login to post a comment