comparison pytouhou/utils/matrix.py @ 123:d1c82d43bbf3

Various optimizations
author Thibaut Girka <thib@sitedethib.com>
date Sat, 10 Sep 2011 11:58:24 +0200
parents ab826bc29aa2
children
comparison
equal deleted inserted replaced
122:174324a4da51 123:d1c82d43bbf3
26 d2 = other_matrix.data 26 d2 = other_matrix.data
27 return Matrix([[sum(d1[i][a] * d2[a][j] for a in xrange(4)) for j in xrange(4)] for i in xrange(4)]) 27 return Matrix([[sum(d1[i][a] * d2[a][j] for a in xrange(4)) for j in xrange(4)] for i in xrange(4)])
28 28
29 29
30 def flip(self): 30 def flip(self):
31 self.data[0][:] = (-x for x in self.data[0]) 31 data = self.data
32 a, b, c, d = data[0]
33 data[0] = [-a, -b, -c, -d]
32 34
33 35
34 def scale(self, x, y, z): 36 def scale(self, x, y, z):
35 d1 = self.data 37 d1 = self.data
36 d1[0][:] = (a * x for a in d1[0]) 38 d1[0] = [a * x for a in d1[0]]
37 d1[1][:] = (a * y for a in d1[1]) 39 d1[1] = [a * y for a in d1[1]]
38 d1[2][:] = (a * z for a in d1[2]) 40 d1[2] = [a * z for a in d1[2]]
39 41
40 42
41 def scale2d(self, x, y): 43 def scale2d(self, x, y):
42 d1 = self.data 44 data = self.data
43 d1[0][:] = (a * x for a in d1[0]) 45 d1a, d1b, d1c, d1d = data[0]
44 d1[1][:] = (a * y for a in d1[1]) 46 d2a, d2b, d2c, d2d = data[1]
47 data[0] = [d1a * x, d1b * x, d1c * x, d1d * x]
48 data[1] = [d2a * y, d2b * y, d2c * y, d2d * y]
45 49
46 50
47 def translate(self, x, y, z): 51 def translate(self, x, y, z):
48 d1 = self.data 52 data = self.data
49 a, b, c = (v * m for v, m in zip(d1[3][:3], (x, y, z))) 53 a, b, c = data[3][:3]
50 d1[0][:] = (v + a for v in d1[0]) 54 a, b, c = a * x, b * y, c * z
51 d1[1][:] = (v + b for v in d1[1]) 55 d1a, d1b, d1c, d1d = data[0]
52 d1[2][:] = (v + c for v in d1[2]) 56 d2a, d2b, d2c, d2d = data[1]
57 d3a, d3b, d3c, d3d = data[2]
58 data[0] = [d1a + a, d1b + a, d1c + a, d1d + a]
59 data[1] = [d2a + b, d2b + b, d2c + b, d2d + b]
60 data[2] = [d3a + c, d3b + c, d3c + c, d3d + c]
53 61
54 62
55 def rotate_x(self, angle): 63 def rotate_x(self, angle):
56 d1 = self.data 64 d1 = self.data
57 cos_a = cos(angle) 65 cos_a = cos(angle)
58 sin_a = sin(angle) 66 sin_a = sin(angle)
59 d1[1][:], d1[2][:] = ([cos_a * d1[1][i] - sin_a * d1[2][i] for i in range(4)], 67 d1[1], d1[2] = ([cos_a * d1[1][i] - sin_a * d1[2][i] for i in range(4)],
60 [sin_a * d1[1][i] + cos_a * d1[2][i] for i in range(4)]) 68 [sin_a * d1[1][i] + cos_a * d1[2][i] for i in range(4)])
61 69
62 70
63 def rotate_y(self, angle): 71 def rotate_y(self, angle):
64 d1 = self.data 72 d1 = self.data
65 cos_a = cos(angle) 73 cos_a = cos(angle)
66 sin_a = sin(angle) 74 sin_a = sin(angle)
67 d1[0][:], d1[2][:] = ([cos_a * d1[0][i] + sin_a * d1[2][i] for i in range(4)], 75 d1[0], d1[2] = ([cos_a * d1[0][i] + sin_a * d1[2][i] for i in range(4)],
68 [- sin_a * d1[0][i] + cos_a * d1[2][i] for i in range(4)]) 76 [- sin_a * d1[0][i] + cos_a * d1[2][i] for i in range(4)])
69 77
70 78
71 def rotate_z(self, angle): 79 def rotate_z(self, angle):
72 d1 = self.data 80 d1 = self.data
73 cos_a = cos(angle) 81 cos_a = cos(angle)
74 sin_a = sin(angle) 82 sin_a = sin(angle)
75 d1[0][:], d1[1][:] = ([cos_a * d1[0][i] - sin_a * d1[1][i] for i in range(4)], 83 d1[0], d1[1] = ([cos_a * d1[0][i] - sin_a * d1[1][i] for i in range(4)],
76 [sin_a * d1[0][i] + cos_a * d1[1][i] for i in range(4)]) 84 [sin_a * d1[0][i] + cos_a * d1[1][i] for i in range(4)])
77 85
78 86
79 @classmethod 87 @classmethod
80 def get_translation_matrix(cls, x, y, z): 88 def get_translation_matrix(cls, x, y, z):
81 return cls([[1., 0., 0., x], 89 return cls([[1., 0., 0., x],