2011-12-20 01:49:24 +00:00
|
|
|
import unittest
|
|
|
|
from test import support
|
|
|
|
from mathutils import Matrix, Vector
|
|
|
|
|
|
|
|
|
|
|
|
class MatrixTesting(unittest.TestCase):
|
|
|
|
def test_matrix_column_access(self):
|
|
|
|
#mat =
|
|
|
|
#[ 1 2 3 4 ]
|
|
|
|
#[ 1 2 3 4 ]
|
|
|
|
#[ 1 2 3 4 ]
|
|
|
|
mat = Matrix(((1, 11, 111),
|
|
|
|
(2, 22, 222),
|
|
|
|
(3, 33, 333),
|
|
|
|
(4, 44, 444)))
|
|
|
|
|
|
|
|
self.assertEqual(mat[0], Vector((1, 11, 111)))
|
|
|
|
self.assertEqual(mat[1], Vector((2, 22, 222)))
|
|
|
|
self.assertEqual(mat[2], Vector((3, 33, 333)))
|
|
|
|
self.assertEqual(mat[3], Vector((4, 44, 444)))
|
|
|
|
|
|
|
|
def test_item_access(self):
|
|
|
|
args = ((1, 4, 0, -1),
|
|
|
|
(2, -1, 2, -2),
|
|
|
|
(0, 3, 8, 3),
|
|
|
|
(-2, 9, 1, 0))
|
|
|
|
|
|
|
|
mat = Matrix(args)
|
|
|
|
|
2011-12-22 01:05:03 +00:00
|
|
|
for row in range(4):
|
|
|
|
for col in range(4):
|
|
|
|
self.assertEqual(mat[row][col], args[row][col])
|
2011-12-20 01:49:24 +00:00
|
|
|
|
|
|
|
self.assertEqual(mat[0][2], 0)
|
|
|
|
self.assertEqual(mat[3][1], 9)
|
|
|
|
self.assertEqual(mat[2][3], 3)
|
|
|
|
self.assertEqual(mat[0][0], 1)
|
|
|
|
self.assertEqual(mat[3][3], 0)
|
|
|
|
|
|
|
|
def test_item_assignment(self):
|
|
|
|
mat = Matrix() - Matrix()
|
|
|
|
indices = (0, 0), (1, 3), (2, 0), (3, 2), (3, 1)
|
|
|
|
checked_indices = []
|
2011-12-22 01:05:03 +00:00
|
|
|
for row, col in indices:
|
|
|
|
mat[row][col] = 1
|
2011-12-20 01:49:24 +00:00
|
|
|
|
2011-12-22 01:05:03 +00:00
|
|
|
for row in range(4):
|
|
|
|
for col in range(4):
|
|
|
|
if mat[row][col]:
|
|
|
|
checked_indices.append((row, col))
|
2011-12-20 01:49:24 +00:00
|
|
|
|
|
|
|
for item in checked_indices:
|
|
|
|
self.assertIn(item, indices)
|
|
|
|
|
|
|
|
def test_matrix_to_3x3(self):
|
|
|
|
#mat =
|
|
|
|
#[ 1 2 3 4 ]
|
|
|
|
#[ 2 4 6 8 ]
|
|
|
|
#[ 3 6 9 12 ]
|
|
|
|
#[ 4 8 12 16 ]
|
|
|
|
mat = Matrix(tuple((i, 2 * i, 3 * i, 4 * i) for i in range(1, 5)))
|
|
|
|
mat_correct = Matrix(((1, 2, 3), (2, 4, 6), (3, 6, 9)))
|
|
|
|
self.assertEqual(mat.to_3x3(), mat_correct)
|
|
|
|
|
|
|
|
def test_matrix_to_translation(self):
|
|
|
|
mat = Matrix()
|
2011-12-22 01:05:03 +00:00
|
|
|
mat[0][3] = 1
|
|
|
|
mat[1][3] = 2
|
|
|
|
mat[2][3] = 3
|
2011-12-20 01:49:24 +00:00
|
|
|
self.assertEqual(mat.to_translation(), Vector((1, 2, 3)))
|
|
|
|
|
2011-12-22 01:05:03 +00:00
|
|
|
def test_matrix_translation(self):
|
|
|
|
mat = Matrix()
|
|
|
|
mat.translation = Vector((1, 2, 3))
|
|
|
|
self.assertEqual(mat[0][3], 1)
|
|
|
|
self.assertEqual(mat[1][3], 2)
|
|
|
|
self.assertEqual(mat[2][3], 3)
|
|
|
|
|
|
|
|
def test_non_square_mult(self):
|
|
|
|
mat1 = Matrix(((1, 2, 3),
|
|
|
|
(4, 5, 6)))
|
|
|
|
mat2 = Matrix(((1, 2),
|
|
|
|
(3, 4),
|
|
|
|
(5, 6)))
|
|
|
|
|
|
|
|
prod_mat1 = Matrix(((22, 28),
|
|
|
|
(49, 64)))
|
|
|
|
prod_mat2 = Matrix(((9, 12, 15),
|
|
|
|
(19, 26, 33),
|
|
|
|
(29, 40, 51)))
|
|
|
|
|
|
|
|
self.assertEqual(mat1*mat2, prod_mat1)
|
|
|
|
self.assertEqual(mat2 * mat1, prod_mat2)
|
|
|
|
|
|
|
|
def test_mat4x4_vec3D_mult(self):
|
|
|
|
mat = Matrix(((1, 0, 2, 0),
|
|
|
|
(0, 6, 0, 0),
|
|
|
|
(0, 0, 1, 1),
|
|
|
|
(0, 0, 0, 1)))
|
|
|
|
|
|
|
|
vec = Vector((1, 2, 3))
|
|
|
|
|
|
|
|
prod_mat_vec = Vector((7, 12, 4))
|
|
|
|
prod_vec_mat = Vector((1, 12, 5))
|
|
|
|
|
|
|
|
self.assertEqual(mat * vec, prod_mat_vec)
|
|
|
|
self.assertEqual(vec * mat, prod_vec_mat)
|
|
|
|
|
|
|
|
def test_mat_vec_mult(self):
|
|
|
|
mat1 = Matrix()
|
|
|
|
|
|
|
|
vec = Vector((1, 2))
|
|
|
|
|
2012-02-11 14:27:36 +00:00
|
|
|
self.assertRaises(ValueError, mat1.__mul__, vec)
|
|
|
|
self.assertRaises(ValueError, vec.__mul__, mat1)
|
2011-12-22 01:05:03 +00:00
|
|
|
|
|
|
|
mat2 = Matrix(((1, 2),
|
|
|
|
(-2, 3)))
|
|
|
|
|
|
|
|
prod = Vector((5, 4))
|
|
|
|
|
|
|
|
self.assertEqual(mat2 * vec, prod)
|
|
|
|
|
2011-12-20 01:49:24 +00:00
|
|
|
def test_matrix_inverse(self):
|
|
|
|
mat = Matrix(((1, 4, 0, -1),
|
|
|
|
(2, -1, 2, -2),
|
|
|
|
(0, 3, 8, 3),
|
|
|
|
(-2, 9, 1, 0)))
|
|
|
|
|
|
|
|
inv_mat = (1 / 285) * Matrix(((195, -57, 27, -102),
|
|
|
|
(50, -19, 4, 6),
|
|
|
|
(-60, 57, 18, 27),
|
|
|
|
(110, -133, 43, -78)))
|
|
|
|
|
|
|
|
self.assertEqual(mat.inverted(), inv_mat)
|
|
|
|
|
|
|
|
def test_matrix_mult(self):
|
|
|
|
mat = Matrix(((1, 4, 0, -1),
|
|
|
|
(2, -1, 2, -2),
|
|
|
|
(0, 3, 8, 3),
|
|
|
|
(-2, 9, 1, 0)))
|
|
|
|
|
|
|
|
prod_mat = Matrix(((11, -9, 7, -9),
|
|
|
|
(4, -3, 12, 6),
|
|
|
|
(0, 48, 73, 18),
|
|
|
|
(16, -14, 26, -13)))
|
|
|
|
|
|
|
|
self.assertEqual(mat * mat, prod_mat)
|
|
|
|
|
|
|
|
|
|
|
|
def test_main():
|
|
|
|
try:
|
|
|
|
support.run_unittest(MatrixTesting)
|
|
|
|
except:
|
|
|
|
import traceback
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
|
|
# alert CTest we failed
|
|
|
|
import sys
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_main()
|