Compare commits
3 Commits
5ca76b424a
...
8a3538c789
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a3538c789 | ||
|
|
6c685aef15 | ||
|
|
f106344504 |
40
matrix/Cargo.lock
generated
Normal file
40
matrix/Cargo.lock
generated
Normal file
@@ -0,0 +1,40 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "approx"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||
|
||||
[[package]]
|
||||
name = "matrix"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"approx",
|
||||
"structs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "structs"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"approx",
|
||||
]
|
||||
@@ -46,6 +46,24 @@ impl Matrix {
|
||||
pub fn new_empty_4() -> Matrix {
|
||||
Matrix::new_empty(4, 4)
|
||||
}
|
||||
|
||||
pub fn identity() -> Matrix {
|
||||
Matrix::new(vec![
|
||||
vec![1.0, 0.0, 0.0, 0.0],
|
||||
vec![0.0, 1.0, 0.0, 0.0],
|
||||
vec![0.0, 0.0, 1.0, 0.0],
|
||||
vec![0.0, 0.0, 0.0, 1.0],
|
||||
])
|
||||
}
|
||||
|
||||
pub fn transpose(&mut self) {
|
||||
self.matrix = vec![
|
||||
vec![self.matrix[0][0], self.matrix[1][0], self.matrix[2][0], self.matrix[3][0], ],
|
||||
vec![self.matrix[0][1], self.matrix[1][1], self.matrix[2][1], self.matrix[3][1], ],
|
||||
vec![self.matrix[0][2], self.matrix[1][2], self.matrix[2][2], self.matrix[3][2], ],
|
||||
vec![self.matrix[0][3], self.matrix[1][3], self.matrix[2][3], self.matrix[3][3], ],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
impl Index<usize> for Matrix {
|
||||
@@ -277,4 +295,57 @@ mod tests {
|
||||
|
||||
assert_eq!(matrix * tuple, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn matrix_by_identity() {
|
||||
let matrix = Matrix::from_array([
|
||||
[0.0, 1.0, 2.0, 4.0,],
|
||||
[1.0, 2.0, 4.0, 8.0,],
|
||||
[2.0, 4.0, 8.0, 16.0],
|
||||
[4.0, 8.0, 16.0, 32.0,]
|
||||
]);
|
||||
|
||||
let expected = Matrix::from_array([
|
||||
[0.0, 1.0, 2.0, 4.0,],
|
||||
[1.0, 2.0, 4.0, 8.0,],
|
||||
[2.0, 4.0, 8.0, 16.0],
|
||||
[4.0, 8.0, 16.0, 32.0,]
|
||||
]);
|
||||
|
||||
assert_eq!(matrix * Matrix::identity(), expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn tuple_by_identity() {
|
||||
let t = Tuple::new(1.0, 2.0, 3.0, 4.0);
|
||||
let expected = Tuple::new(1.0, 2.0, 3.0, 4.0);
|
||||
|
||||
assert_eq!(Matrix::identity() * t, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn transposition() {
|
||||
let mut m = Matrix::from_array([
|
||||
[0.0, 9.0, 3.0, 0.0],
|
||||
[9.0, 8.0, 0.0, 8.0],
|
||||
[1.0, 8.0, 5.0, 3.0],
|
||||
[0.0, 0.0, 5.0, 8.0],
|
||||
]);
|
||||
|
||||
let expected = Matrix::from_array([
|
||||
[0.0, 9.0, 1.0, 0.0],
|
||||
[9.0, 8.0, 8.0, 0.0],
|
||||
[3.0, 0.0, 5.0, 5.0],
|
||||
[0.0, 8.0, 3.0, 8.0],
|
||||
]);
|
||||
m.transpose();
|
||||
assert_eq!(m, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn transpose_identity() {
|
||||
let mut m = Matrix::identity();
|
||||
m.transpose();
|
||||
assert_eq!(m, Matrix::identity());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user