Mercurial > touhou
comparison pytouhou/utils/matrix.pyx @ 417:efae61ad6efe
Remove the type of the self argument in extension types, as it clutters the code with useless information.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Thu, 22 Aug 2013 12:21:12 +0200 |
parents | 5fe6cd6ceb48 |
children | d8630c086926 |
comparison
equal
deleted
inserted
replaced
416:e23871eddb7a | 417:efae61ad6efe |
---|---|
15 from libc.math cimport sin, cos | 15 from libc.math cimport sin, cos |
16 from ctypes import c_float | 16 from ctypes import c_float |
17 | 17 |
18 | 18 |
19 cdef class Matrix: | 19 cdef class Matrix: |
20 def __init__(Matrix self, data=None): | 20 def __init__(self, data=None): |
21 self.data = data or [[1, 0, 0, 0], | 21 self.data = data or [[1, 0, 0, 0], |
22 [0, 1, 0, 0], | 22 [0, 1, 0, 0], |
23 [0, 0, 1, 0], | 23 [0, 0, 1, 0], |
24 [0, 0, 0, 1]] | 24 [0, 0, 0, 1]] |
25 | 25 |
26 | 26 |
27 def __mul__(Matrix self, Matrix other): | 27 def __mul__(self, Matrix other): |
28 out = Matrix() | 28 out = Matrix() |
29 d1 = self.data | 29 d1 = self.data |
30 d2 = other.data | 30 d2 = other.data |
31 d3 = out.data | 31 d3 = out.data |
32 for i in xrange(4): | 32 for i in xrange(4): |
33 for j in xrange(4): | 33 for j in xrange(4): |
34 d3[i][j] = sum(d1[i][k] * d2[k][j] for k in xrange(4)) | 34 d3[i][j] = sum(d1[i][k] * d2[k][j] for k in xrange(4)) |
35 return out | 35 return out |
36 | 36 |
37 | 37 |
38 def get_c_data(Matrix self): | 38 def get_c_data(self): |
39 data = sum(self.data, []) | 39 data = sum(self.data, []) |
40 return (c_float * 16)(*data) | 40 return (c_float * 16)(*data) |
41 | 41 |
42 | 42 |
43 cpdef flip(Matrix self): | 43 cpdef flip(self): |
44 data = self.data | 44 data = self.data |
45 a, b, c, d = data[0] | 45 a, b, c, d = data[0] |
46 data[0] = [-a, -b, -c, -d] | 46 data[0] = [-a, -b, -c, -d] |
47 | 47 |
48 | 48 |
49 cpdef scale(Matrix self, x, y, z): | 49 cpdef scale(self, x, y, z): |
50 d1 = self.data | 50 d1 = self.data |
51 d1[0] = [a * x for a in d1[0]] | 51 d1[0] = [a * x for a in d1[0]] |
52 d1[1] = [a * y for a in d1[1]] | 52 d1[1] = [a * y for a in d1[1]] |
53 d1[2] = [a * z for a in d1[2]] | 53 d1[2] = [a * z for a in d1[2]] |
54 | 54 |
55 | 55 |
56 cpdef scale2d(Matrix self, x, y): | 56 cpdef scale2d(self, x, y): |
57 data = self.data | 57 data = self.data |
58 d1a, d1b, d1c, d1d = data[0] | 58 d1a, d1b, d1c, d1d = data[0] |
59 d2a, d2b, d2c, d2d = data[1] | 59 d2a, d2b, d2c, d2d = data[1] |
60 data[0] = [d1a * x, d1b * x, d1c * x, d1d * x] | 60 data[0] = [d1a * x, d1b * x, d1c * x, d1d * x] |
61 data[1] = [d2a * y, d2b * y, d2c * y, d2d * y] | 61 data[1] = [d2a * y, d2b * y, d2c * y, d2d * y] |
62 | 62 |
63 | 63 |
64 cpdef translate(Matrix self, x, y, z): | 64 cpdef translate(self, x, y, z): |
65 data = self.data | 65 data = self.data |
66 a, b, c = data[3][:3] | 66 a, b, c = data[3][:3] |
67 a, b, c = a * x, b * y, c * z | 67 a, b, c = a * x, b * y, c * z |
68 d1a, d1b, d1c, d1d = data[0] | 68 d1a, d1b, d1c, d1d = data[0] |
69 d2a, d2b, d2c, d2d = data[1] | 69 d2a, d2b, d2c, d2d = data[1] |
71 data[0] = [d1a + a, d1b + a, d1c + a, d1d + a] | 71 data[0] = [d1a + a, d1b + a, d1c + a, d1d + a] |
72 data[1] = [d2a + b, d2b + b, d2c + b, d2d + b] | 72 data[1] = [d2a + b, d2b + b, d2c + b, d2d + b] |
73 data[2] = [d3a + c, d3b + c, d3c + c, d3d + c] | 73 data[2] = [d3a + c, d3b + c, d3c + c, d3d + c] |
74 | 74 |
75 | 75 |
76 cpdef rotate_x(Matrix self, angle): | 76 cpdef rotate_x(self, angle): |
77 d1 = self.data | 77 d1 = self.data |
78 cos_a = cos(angle) | 78 cos_a = cos(angle) |
79 sin_a = sin(angle) | 79 sin_a = sin(angle) |
80 d1[1], d1[2] = ([cos_a * d1[1][i] - sin_a * d1[2][i] for i in range(4)], | 80 d1[1], d1[2] = ([cos_a * d1[1][i] - sin_a * d1[2][i] for i in range(4)], |
81 [sin_a * d1[1][i] + cos_a * d1[2][i] for i in range(4)]) | 81 [sin_a * d1[1][i] + cos_a * d1[2][i] for i in range(4)]) |
82 | 82 |
83 | 83 |
84 cpdef rotate_y(Matrix self, angle): | 84 cpdef rotate_y(self, angle): |
85 d1 = self.data | 85 d1 = self.data |
86 cos_a = cos(angle) | 86 cos_a = cos(angle) |
87 sin_a = sin(angle) | 87 sin_a = sin(angle) |
88 d1[0], d1[2] = ([cos_a * d1[0][i] + sin_a * d1[2][i] for i in range(4)], | 88 d1[0], d1[2] = ([cos_a * d1[0][i] + sin_a * d1[2][i] for i in range(4)], |
89 [- sin_a * d1[0][i] + cos_a * d1[2][i] for i in range(4)]) | 89 [- sin_a * d1[0][i] + cos_a * d1[2][i] for i in range(4)]) |
90 | 90 |
91 | 91 |
92 cpdef rotate_z(Matrix self, angle): | 92 cpdef rotate_z(self, angle): |
93 d1 = self.data | 93 d1 = self.data |
94 cos_a = cos(angle) | 94 cos_a = cos(angle) |
95 sin_a = sin(angle) | 95 sin_a = sin(angle) |
96 d1[0], d1[1] = ([cos_a * d1[0][i] - sin_a * d1[1][i] for i in range(4)], | 96 d1[0], d1[1] = ([cos_a * d1[0][i] - sin_a * d1[1][i] for i in range(4)], |
97 [sin_a * d1[0][i] + cos_a * d1[1][i] for i in range(4)]) | 97 [sin_a * d1[0][i] + cos_a * d1[1][i] for i in range(4)]) |