Commit 6fd0ac65e9152e40742b14f8240d350cb43ea621
1 parent
18da9a08
Make TMatrix constructors part of the implementation
Showing
2 changed files
with
100 additions
and
115 deletions
| @@ -33,8 +33,8 @@ use fractional::easel::{ Coordinate, Coordinates, Drawable, Line, Polyline | @@ -33,8 +33,8 @@ use fractional::easel::{ Coordinate, Coordinates, Drawable, Line, Polyline | ||
| 33 | , Polygon, Rectangle}; | 33 | , Polygon, Rectangle}; |
| 34 | use fractional::fractional::{Fractional, from_vector}; | 34 | use fractional::fractional::{Fractional, from_vector}; |
| 35 | use fractional::trigonometry::Trig; | 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 | use fractional::xcb::XcbEasel; | 39 | use fractional::xcb::XcbEasel; |
| 40 | use fractional::easel::Canvas; | 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,7 +204,7 @@ fn _transform<T>(v :Vector<T>, v1 :Vector<T>, v2 :Vector<T>, v3 :Vector<T>) | ||
| 204 | + Debug + From<i32> + Copy + Display { | 204 | + Debug + From<i32> + Copy + Display { |
| 205 | 205 | ||
| 206 | println!("{:>14} : {}", "Vector v1", v1); | 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 | println!(); | 208 | println!(); |
| 209 | 209 | ||
| 210 | fn _rot<T>( o :&str , n :&str , v :&Vector<T> | 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,21 +223,21 @@ fn _transform<T>(v :Vector<T>, v1 :Vector<T>, v2 :Vector<T>, v3 :Vector<T>) | ||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | println!("{:>14} : {}", "Vector v2", v2); | 225 | println!("{:>14} : {}", "Vector v2", v2); |
| 226 | - _rot("rot_x", "v2", &v2, &[&rotate_x]); | 226 | + _rot("rot_x", "v2", &v2, &[&TMatrix::rotate_x]); |
| 227 | println!(); | 227 | println!(); |
| 228 | - _rot("rot_y", "v2", &v2, &[&rotate_y]); | 228 | + _rot("rot_y", "v2", &v2, &[&TMatrix::rotate_y]); |
| 229 | println!(); | 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 | println!(); | 231 | println!(); |
| 232 | println!("{:>14} : {}", "Vector v3", v3); | 232 | println!("{:>14} : {}", "Vector v3", v3); |
| 233 | - _rot("rot_z", "v3", &v3, &[&rotate_z]); | 233 | + _rot("rot_z", "v3", &v3, &[&TMatrix::rotate_z]); |
| 234 | println!(); | 234 | println!(); |
| 235 | 235 | ||
| 236 | for d in [ 30, 45, 60, 90, 120, 135, 150, 180 | 236 | for d in [ 30, 45, 60, 90, 120, 135, 150, 180 |
| 237 | , 210, 225, 240, 270, 300, 315, 330 ].iter() { | 237 | , 210, 225, 240, 270, 300, 315, 330 ].iter() { |
| 238 | println!( "{:>14} : {}" | 238 | println!( "{:>14} : {}" |
| 239 | , format!("rot_v {} v2", d) | 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,7 +272,7 @@ fn _line() { | ||
| 272 | let j = Vector(Fractional( 30,1), Fractional( 30,1), Fractional(0,1)); | 272 | let j = Vector(Fractional( 30,1), Fractional( 30,1), Fractional(0,1)); |
| 273 | let k = Vector(Fractional(-30,1), Fractional( 30,1), Fractional(0,1)); | 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 | let Vector(ix, iy, _) = rot.apply(&i); | 276 | let Vector(ix, iy, _) = rot.apply(&i); |
| 277 | let Vector(jx, jy, _) = rot.apply(&j); | 277 | let Vector(jx, jy, _) = rot.apply(&j); |
| 278 | let Vector(kx, ky, _) = rot.apply(&k); | 278 | let Vector(kx, ky, _) = rot.apply(&k); |
| @@ -293,7 +293,7 @@ fn _line() { | @@ -293,7 +293,7 @@ fn _line() { | ||
| 293 | let j = Vector( 30.0, 30.0, 0.0); | 293 | let j = Vector( 30.0, 30.0, 0.0); |
| 294 | let k = Vector(-30.0, 30.0, 0.0); | 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 | let Vector(ix, iy, _) = rot.apply(&i); | 297 | let Vector(ix, iy, _) = rot.apply(&i); |
| 298 | let Vector(jx, jy, _) = rot.apply(&j); | 298 | let Vector(jx, jy, _) = rot.apply(&j); |
| 299 | let Vector(kx, ky, _) = rot.apply(&k); | 299 | let Vector(kx, ky, _) = rot.apply(&k); |
| @@ -334,22 +334,26 @@ fn _democanvas<T>( xcb :&XcbEasel | @@ -334,22 +334,26 @@ fn _democanvas<T>( xcb :&XcbEasel | ||
| 334 | let step = Duration::from_millis(25); | 334 | let step = Duration::from_millis(25); |
| 335 | let mut last = Instant::now(); | 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 | // We do not need this here… it is used within projection… | 340 | // We do not need this here… it is used within projection… |
| 339 | // let p :TMatrix<T> = camera.get_projection(); | 341 | // let p :TMatrix<T> = camera.get_projection(); |
| 340 | 342 | ||
| 341 | loop { | 343 | loop { |
| 342 | let deg = ((start.elapsed() / 25).as_millis() % 360) as i32; | 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 | // I can not apply the projection in one turn, as I generate the | 350 | // I can not apply the projection in one turn, as I generate the |
| 347 | // normals always… and this is no longer possible after the | 351 | // normals always… and this is no longer possible after the |
| 348 | // projection… | 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 | let objects = vec!( (tetrahedron.transform(&rot1), 0xFFFF00) | 358 | let objects = vec!( (tetrahedron.transform(&rot1), 0xFFFF00) |
| 355 | , ( cube.transform(&rot2), 0x0000FF) ); | 359 | , ( cube.transform(&rot2), 0x0000FF) ); |
| @@ -410,16 +414,18 @@ fn main() { | @@ -410,16 +414,18 @@ fn main() { | ||
| 410 | 414 | ||
| 411 | _democanvas( &xcb, "Something...(f64)", tx.clone() | 415 | _democanvas( &xcb, "Something...(f64)", tx.clone() |
| 412 | , Polyeder::triangle(60.0) | 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 | , DirectLight::new(Vector(0.0, 0.0, 1.0)) ); | 419 | , DirectLight::new(Vector(0.0, 0.0, 1.0)) ); |
| 420 | + /* | ||
| 416 | _democanvas( &xcb, "Something...(Fractional)", tx.clone() | 421 | _democanvas( &xcb, "Something...(Fractional)", tx.clone() |
| 417 | , Polyeder::triangle(Fractional(60,1)) | 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 | , DirectLight::new(Vector( Fractional(0,1) | 425 | , DirectLight::new(Vector( Fractional(0,1) |
| 421 | , Fractional(0,1) | 426 | , Fractional(0,1) |
| 422 | , Fractional(1,1) )) ); | 427 | , Fractional(1,1) )) ); |
| 428 | + */ | ||
| 423 | 429 | ||
| 424 | for x in rx { | 430 | for x in rx { |
| 425 | match x { | 431 | match x { |
| @@ -31,121 +31,100 @@ pub struct TMatrix<T>( (T, T, T, T) | @@ -31,121 +31,100 @@ pub struct TMatrix<T>( (T, T, T, T) | ||
| 31 | , (T, T, T, T) ) | 31 | , (T, T, T, T) ) |
| 32 | where T: Add + Sub + Neg + Mul + Div + Debug + Trig + From<i32> + Copy; | 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 | where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> | 35 | where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> |
| 36 | + Mul<Output = T> + Div<Output = T> | 36 | + Mul<Output = T> + Div<Output = T> |
| 37 | + Debug + Trig + From<i32> + Copy { | 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 | pub fn combine<I>(mi :I) -> TMatrix<T> | 124 | pub fn combine<I>(mi :I) -> TMatrix<T> |
| 146 | where I: IntoIterator<Item = TMatrix<T>> { | 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 | pub fn apply(&self, v :&Vector<T>) -> Vector<T> { | 130 | pub fn apply(&self, v :&Vector<T>) -> Vector<T> { |
Please
register
or
login
to post a comment