Mercurial > touhou
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], |