Mercurial > touhou
diff 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 |
line wrap: on
line diff
--- a/pytouhou/utils/matrix.py +++ b/pytouhou/utils/matrix.py @@ -28,52 +28,60 @@ class Matrix(object): def flip(self): - self.data[0][:] = (-x for x in self.data[0]) + data = self.data + a, b, c, d = data[0] + data[0] = [-a, -b, -c, -d] def scale(self, x, y, z): d1 = self.data - d1[0][:] = (a * x for a in d1[0]) - d1[1][:] = (a * y for a in d1[1]) - d1[2][:] = (a * z for a in d1[2]) + d1[0] = [a * x for a in d1[0]] + d1[1] = [a * y for a in d1[1]] + d1[2] = [a * z for a in d1[2]] def scale2d(self, x, y): - d1 = self.data - d1[0][:] = (a * x for a in d1[0]) - d1[1][:] = (a * y for a in d1[1]) + data = self.data + d1a, d1b, d1c, d1d = data[0] + d2a, d2b, d2c, d2d = data[1] + data[0] = [d1a * x, d1b * x, d1c * x, d1d * x] + data[1] = [d2a * y, d2b * y, d2c * y, d2d * y] def translate(self, x, y, z): - d1 = self.data - a, b, c = (v * m for v, m in zip(d1[3][:3], (x, y, z))) - d1[0][:] = (v + a for v in d1[0]) - d1[1][:] = (v + b for v in d1[1]) - d1[2][:] = (v + c for v in d1[2]) + data = self.data + a, b, c = data[3][:3] + a, b, c = a * x, b * y, c * z + d1a, d1b, d1c, d1d = data[0] + d2a, d2b, d2c, d2d = data[1] + d3a, d3b, d3c, d3d = data[2] + data[0] = [d1a + a, d1b + a, d1c + a, d1d + a] + data[1] = [d2a + b, d2b + b, d2c + b, d2d + b] + data[2] = [d3a + c, d3b + c, d3c + c, d3d + c] def rotate_x(self, angle): d1 = self.data cos_a = cos(angle) sin_a = sin(angle) - d1[1][:], d1[2][:] = ([cos_a * d1[1][i] - sin_a * d1[2][i] for i in range(4)], - [sin_a * d1[1][i] + cos_a * d1[2][i] for i in range(4)]) + d1[1], d1[2] = ([cos_a * d1[1][i] - sin_a * d1[2][i] for i in range(4)], + [sin_a * d1[1][i] + cos_a * d1[2][i] for i in range(4)]) def rotate_y(self, angle): d1 = self.data cos_a = cos(angle) sin_a = sin(angle) - d1[0][:], d1[2][:] = ([cos_a * d1[0][i] + sin_a * d1[2][i] for i in range(4)], - [- sin_a * d1[0][i] + cos_a * d1[2][i] for i in range(4)]) + d1[0], d1[2] = ([cos_a * d1[0][i] + sin_a * d1[2][i] for i in range(4)], + [- sin_a * d1[0][i] + cos_a * d1[2][i] for i in range(4)]) def rotate_z(self, angle): d1 = self.data cos_a = cos(angle) sin_a = sin(angle) - d1[0][:], d1[1][:] = ([cos_a * d1[0][i] - sin_a * d1[1][i] for i in range(4)], - [sin_a * d1[0][i] + cos_a * d1[1][i] for i in range(4)]) + d1[0], d1[1] = ([cos_a * d1[0][i] - sin_a * d1[1][i] for i in range(4)], + [sin_a * d1[0][i] + cos_a * d1[1][i] for i in range(4)]) @classmethod