Fri, 22 Dec 2017 15:13:43 +0200
Added matrix code, moved library paths to ldcheck.cfg.
| 7 | 1 | def degree_rep(angle): | 
| 2 | from math import degrees | |
| 3 | return '∠ %.2f°' % degrees(angle) | |
| 4 | ||
| 5 | def position_vector(vertex): | |
| 6 | assert isinstance(vertex, Vertex) | |
| 7 | return Vector(*vertex.coordinates) | |
| 8 | ||
| 9 | def angle_magnitude_key(angle): | |
| 10 | ''' | |
| 11 | Returns how great an angle is. | |
| 12 | ''' | |
| 13 | from math import pi as π | |
| 14 | normalized_angle = abs(angle) % (2 * π) | |
| 15 | if normalized_angle > π: | |
| 16 | normalized_angle = (2 * π) - normalized_angle | |
| 17 | return normalized_angle | |
| 18 | ||
| 0 | 19 | class Vertex: | 
| 20 | def __init__(self, x, y, z): | |
| 5 | 21 | if not all(is_real(coordinate) for coordinate in (x, y, z)): | 
| 22 | raise ValueError(str.format('Bad vertex coordinates: {!r}', | |
| 23 | (x, y, z), | |
| 24 | )) | |
| 0 | 25 | self.x, self.y, self.z = x, y, z | 
| 26 | def __repr__(self): | |
| 27 | return str.format('Vertex({!r}, {!r}, {!r})', self.x, self.y, self.z) | |
| 28 | def distance_to(self, other): | |
| 29 | # can't use hypot because of 3 arguments | |
| 30 | from math import sqrt | |
| 31 | return sqrt( | |
| 32 | (self.x - other.x) ** 2 + | |
| 33 | (self.y - other.y) ** 2 + | |
| 34 | (self.z - other.z) ** 2 | |
| 35 | ) | |
| 
3
 
1dc58f44d556
Can now write dat files, added direct color handling
 
Santeri Piippo 
parents: 
1 
diff
changeset
 | 
36 | @property | 
| 
 
1dc58f44d556
Can now write dat files, added direct color handling
 
Santeri Piippo 
parents: 
1 
diff
changeset
 | 
37 | def coordinates(self): | 
| 
 
1dc58f44d556
Can now write dat files, added direct color handling
 
Santeri Piippo 
parents: 
1 
diff
changeset
 | 
38 | return self.x, self.y, self.z | 
| 5 | 39 | def __add__(self, other): | 
| 7 | 40 | assert not (type(self) == type(other) == Vertex) | 
| 41 | if type(self) == Vector and type(other) == Vector: | |
| 42 | result_type = Vector | |
| 43 | else: | |
| 44 | result_type = Vertex | |
| 45 | return result_type(self.x + other.x, self.y + other.y, self.z + other.z) | |
| 46 | def __radd__(self, other): | |
| 47 | return self + other | |
| 5 | 48 | def __neg__(self): | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
49 | return type(self)(-self.x, -self.y, -self.z) | 
| 5 | 50 | def __sub__(self, other): | 
| 7 | 51 | result = self + (-position_vector(other)) | 
| 52 | if isinstance(other, Vertex): | |
| 53 | return Vector(*result.coordinates) | |
| 54 | else: | |
| 55 | return result | |
| 5 | 56 | def __mul__(self, scalar): | 
| 7 | 57 | assert is_real(scalar) | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
58 | return type(self)(self.x * scalar, self.y * scalar, self.z * scalar) | 
| 5 | 59 | def __rmul__(self, other): | 
| 60 | return self * other | |
| 61 | def __truediv__(self, scalar): | |
| 7 | 62 | assert is_real(scalar) | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
63 | return type(self)(self.x / scalar, self.y / scalar, self.z / scalar) | 
| 5 | 64 | def __floordiv__(self, scalar): | 
| 7 | 65 | assert is_real(scalar) | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
66 | return type(self)(self.x // scalar, self.y // scalar, self.z // scalar) | 
| 5 | 67 | def __matmul__(self, transformation_matrix): | 
| 68 | return transform(self, transformation_matrix) | |
| 69 | def __eq__(self, other): | |
| 70 | return self.coordinates == other.coordinates | |
| 71 | def __lt__(self, other): | |
| 72 | return self.coordinates < other.coordinates | |
| 73 | def __hash__(self): | |
| 74 | return hash(self.coordinates) | |
| 75 | ||
| 76 | class VertexOp: | |
| 77 | def __init__(self, callable): | |
| 78 | self.callable = callable | |
| 79 | def __rmul__(self, coordinate): | |
| 80 | return self.callable(coordinate) | |
| 0 | 81 | |
| 82 | class LineSegment: | |
| 83 | def __init__(self, v1, v2): | |
| 84 | self.v1, self.v2 = v1, v2 | |
| 85 | def __repr__(self): | |
| 86 | return str.format('LineSegment({!r}, {!r})', self.v1, self.v2) | |
| 
3
 
1dc58f44d556
Can now write dat files, added direct color handling
 
Santeri Piippo 
parents: 
1 
diff
changeset
 | 
87 | @property | 
| 7 | 88 | def length(self): | 
| 89 | return self.v1.distance_to(self.v2) | |
| 90 | @property | |
| 
3
 
1dc58f44d556
Can now write dat files, added direct color handling
 
Santeri Piippo 
parents: 
1 
diff
changeset
 | 
91 | def vertices(self): | 
| 
 
1dc58f44d556
Can now write dat files, added direct color handling
 
Santeri Piippo 
parents: 
1 
diff
changeset
 | 
92 | return self.v1, self.v2 | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
93 | def __len__(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
94 | return 2 | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
95 | def __getitem__(self, index): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
96 | return self.vertices[index] | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
97 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
98 | class IndexRing: | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
99 | def __init__(self, container): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
100 | self.container = container | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
101 | def __getitem__(self, index): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
102 | return self.container[index % len(self.container)] | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
103 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
104 | class Vector(Vertex): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
105 | def __init__(self, x, y, z): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
106 | super().__init__(x, y, z) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
107 | def __repr__(self): | 
| 7 | 108 | return str.format('Vector({!r}, {!r}, {!r})', self.x, self.y, self.z) | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
109 | def length(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
110 | from math import sqrt | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
111 | return sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
112 | def normalized(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
113 | length = self.length() | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
114 | if length > 0: | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
115 | return Vector(self.x / length, self.y / length, self.z / length) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
116 | else: | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
117 | return Vector(0, 0, 0) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
118 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
119 | def dot_product(v1, v2): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
120 | ''' Returns the dot product v1 · v2. ''' | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
121 | return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
122 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
123 | def cross_product(v1, v2): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
124 | ''' Returns the cross product v1 × v2. ''' | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
125 | return Vector( | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
126 | x = v1.y * v2.z - v1.z * v2.y, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
127 | y = v1.z * v2.x - v1.x * v2.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
128 | z = v1.x * v2.y - v1.y * v2.x, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
129 | ) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
130 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
131 | def unit_normal(a, b, c): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
132 | x = Matrix3x3([ | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
133 | 1, a.y, a.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
134 | 1, b.y, b.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
135 | 1, c.y, c.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
136 | ]).determinant() | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
137 | y = Matrix3x3([ | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
138 | a.x, 1, a.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
139 | b.x, 1, b.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
140 | c.x, 1, c.z, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
141 | ]).determinant() | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
142 | z = Matrix3x3([ | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
143 | a.x, a.y, 1, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
144 | b.x, b.y, 1, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
145 | c.x, c.y, 1, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
146 | ]).determinant() | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
147 | return Vector(x, y, z).normalized() | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
148 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
149 | def pairs(iterable, *, count = 2): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
150 | ''' | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
151 | Iterates the given iterable and returns tuples containing `count` | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
152 | sequential values in the iterable. | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
153 | |
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
154 | Formally, for a vector A with indices 0…n and pair count k, this | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
155 | function yields: | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
156 | (A₀, A₁, …, Aₖ), | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
157 | (A₁, A₂, …, Aₖ₊₁), | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
158 | …, | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
159 | (Aₙ₋₂, Aₙ₋₁, …, Aₖ₋₂), | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
160 | (Aₙ₋₁, A₀, …, Aₖ₋₁). | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
161 | ''' | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
162 | iterable_count = len(iterable) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
163 | for index in range(iterable_count): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
164 | yield tuple( | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
165 | iterable[(index + offset) % iterable_count] | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
166 | for offset in range(count) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
167 | ) | 
| 0 | 168 | |
| 1 | 169 | class Polygon: | 
| 170 | def __init__(self, vertices): | |
| 171 | self.vertices = vertices | |
| 172 | def __repr__(self): | |
| 173 | return str.format('Polygon({!r})', self.vertices) | |
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
174 | def area(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
175 | total = Vector(0, 0, 0) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
176 | for v1, v2 in pairs(self.vertices): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
177 | total += cross_product(v1, v2) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
178 | return dot_product(total, unit_normal(self.vertices[0], self.vertices[1], self.vertices[2])) | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
179 | def centroid(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
180 | ... | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
181 | raise NotImplementedError | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
182 | def __getitem__(self, index): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
183 | return self.vertices[index % len(self.vertices)] | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
184 | def __len__(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
185 | return len(self.vertices) | 
| 7 | 186 | @property | 
| 187 | def perimeter_lines(self): | |
| 188 | for v1, v2 in pairs(self.vertices): | |
| 189 | yield LineSegment(v1, v2) | |
| 190 | @property | |
| 191 | def smallest_angle(self): | |
| 192 | from math import acos, inf | |
| 193 | min_angle = inf | |
| 194 | for v1, v2, v3 in pairs(self.vertices, count = 3): | |
| 195 | vec1 = (position_vector(v3) - position_vector(v2)).normalized() | |
| 196 | vec2 = (position_vector(v1) - position_vector(v2)).normalized() | |
| 197 | cosine = dot_product(vec1, vec2) / vec1.length() / vec2.length() | |
| 198 | min_angle = min(min_angle, angle_magnitude_key(acos(cosine))) | |
| 199 | return min_angle | |
| 200 | @property | |
| 201 | def hairline_ratio(self): | |
| 202 | lengths = [line.length for line in self.perimeter_lines] | |
| 203 | return max(lengths) / min(lengths) | |
| 1 | 204 | |
| 0 | 205 | def is_real(number): | 
| 206 | return isinstance(number, int) or isinstance(number, float) | |
| 207 | ||
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
208 | def matrix_indices(): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
209 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
210 | Yields index pairs for matrix iteration | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
211 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
212 | from itertools import product | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
213 | yield from product(range(3), range(3)) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
214 | |
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
215 | class Matrix3x3: | 
| 0 | 216 | ''' | 
| 217 | A 3×3 matrix forming the top-left portion of a full 4×4 transformation | |
| 218 | matrix. | |
| 219 | ''' | |
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
220 | class Row: | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
221 | def __init__(self, matrix_ref, i1, i2, i3): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
222 | self.matrix_ref = matrix_ref | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
223 | self.matrix_indices = i1, i2, i3 | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
224 | def __getitem__(self, row_index): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
225 | return self.matrix_ref[self.matrix_indices[row_index]] | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
226 | def __setitem__(self, row_index, value): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
227 | self.matrix_ref[self.matrix_indices[row_index]] = value | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
228 | def __init__(self, values = None): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
229 | if values is not None: | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
230 | assert(all(is_real(x) for x in values)) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
231 | assert len(values) == 9 | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
232 | self.values = values | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
233 | else: | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
234 | self.values = [1, 0, 0, 0, 1, 0, 0, 0, 1] | 
| 0 | 235 | def __repr__(self): | 
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
236 | if self != Matrix3x3(): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
237 | return str.format('Matrix3x3({!r})', self.values) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
238 | else: | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
239 | return 'Matrix3x3()' | 
| 0 | 240 | def __getitem__(self, index): | 
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
241 | if isinstance(index, tuple): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
242 | assert all(k in [0, 1, 2] for k in index) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
243 | return self.values[index[0] * 3 + index[1]] | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
244 | else: | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
245 | return Matrix3x3.Row(self, index * 3, index * 3 + 1, index * 3 + 2) | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
246 | def determinant(self): | 
| 
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
247 | return sum([ | 
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
248 | +(self[0, 0] * self[1, 1] * self[2, 2]), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
249 | +(self[0, 1] * self[1, 2] * self[2, 0]), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
250 | +(self[0, 2] * self[1, 0] * self[2, 1]), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
251 | -(self[0, 2] * self[1, 1] * self[2, 0]), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
252 | -(self[0, 1] * self[1, 0] * self[2, 2]), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
253 | -(self[0, 0] * self[1, 2] * self[2, 1]), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
254 | ]) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
255 | @property | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
256 | def scaling_vector(self): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
257 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
258 | Extracts scaling factors from this transformation matrix. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
259 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
260 | from math import sqrt | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
261 | return Vector( | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
262 | x = sqrt(self[0, 0] ** 2 + self[1, 0] ** 2 + self[2, 0] ** 2), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
263 | y = sqrt(self[0, 1] ** 2 + self[1, 1] ** 2 + self[2, 1] ** 2), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
264 | z = sqrt(self[0, 2] ** 2 + self[1, 2] ** 2 + self[2, 2] ** 2), | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
265 | ) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
266 | @property | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
267 | def rotation_component(self): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
268 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
269 | Extracts rotation from this matrix. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
270 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
271 | return self.split()[0] | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
272 | def split(self): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
273 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
274 | Extracts the rotation matrix and scaling vector. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
275 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
276 | vec = self.scaling_vector | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
277 | return Matrix3x3([ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
278 | self[i, j] / vec.coordinates[j] | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
279 | for i, j in matrix_indices() | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
280 | ]), vec | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
281 | @property | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
282 | def contains_scaling(self): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
283 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
284 | Returns whether this matrix contains scaling factors. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
285 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
286 | vec = self.scaling_vector | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
287 | return abs((vec.x * vec.y * vec.z) - 1) >= 1e-10 | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
288 | @property | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
289 | def contains_rotation(self): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
290 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
291 | Returns whether this matrix contains rotation factors. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
292 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
293 | return self.rotation_component != Matrix3x3() | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
294 | def __eq__(self, other): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
295 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
296 | Returns whether two matrices are equivalent. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
297 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
298 | return all( | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
299 | abs(self[(i, j)] - other[(i, j)]) < 1e-10 | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
300 | for i, j in matrix_indices() | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
301 | ) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
302 | def __matmul__(self, other): | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
303 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
304 | Computes the matrix multiplication self × other. | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
305 | ''' | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
306 | return Matrix3x3([ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
307 | sum(self[i, k] * other[k, j] for k in range(3)) | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
308 | for i, j in matrix_indices() | 
| 
6
 
6da1e81c5652
Added code to compute areas of triangles and quadrilaterals
 
Santeri Piippo 
parents: 
5 
diff
changeset
 | 
309 | ]) | 
| 0 | 310 | |
| 311 | def complete_matrix(matrix, anchor): | |
| 312 | ''' | |
| 313 | Combines a 3×3 matrix and an anchor vertex into a full 4×4 | |
| 314 | transformation matrix. | |
| 315 | ''' | |
| 316 | return [ | |
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
317 | matrix[0, 0], matrix[0, 1], matrix[0, 2], anchor.x, | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
318 | matrix[1, 0], matrix[1, 1], matrix[1, 2], anchor.y, | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
319 | matrix[2, 0], matrix[2, 1], matrix[2, 2], anchor.z, | 
| 0 | 320 | 0, 0, 0, 1, | 
| 321 | ] | |
| 322 | ||
| 323 | def transform(vertex, transformation_matrix): | |
| 324 | ''' | |
| 325 | Transforms a vertex by a 4×4 transformation matrix. | |
| 326 | ''' | |
| 
9
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
327 | return Vertex( | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
328 | x = transformation_matrix[0] * vertex.x \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
329 | + transformation_matrix[1] * vertex.y \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
330 | + transformation_matrix[2] * vertex.z \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
331 | + transformation_matrix[3], | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
332 | y = transformation_matrix[4] * vertex.x \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
333 | + transformation_matrix[5] * vertex.y \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
334 | + transformation_matrix[6] * vertex.z \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
335 | + transformation_matrix[7], | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
336 | z = transformation_matrix[8] * vertex.x \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
337 | + transformation_matrix[9] * vertex.y \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
338 | + transformation_matrix[10] * vertex.z \ | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
339 | + transformation_matrix[11], | 
| 
 
fea8e9ae6f29
Added matrix code, moved library paths to ldcheck.cfg.
 
Santeri Piippo 
parents: 
7 
diff
changeset
 | 
340 | ) |