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)])