geometry.py

changeset 147
bec55b021ae7
parent 103
662de6b8cfc2
equal deleted inserted replaced
146:3555679d276b 147:bec55b021ae7
193 return len(self.vertices) 193 return len(self.vertices)
194 @property 194 @property
195 def perimeter_lines(self): 195 def perimeter_lines(self):
196 for v1, v2 in pairs(self.vertices): 196 for v1, v2 in pairs(self.vertices):
197 yield LineSegment(v1, v2) 197 yield LineSegment(v1, v2)
198 @property 198 def angle_cosines(self):
199 def angles(self): 199 from math import isclose
200 from math import acos, isclose
201 for v1, v2, v3 in pairs(self.vertices, count = 3): 200 for v1, v2, v3 in pairs(self.vertices, count = 3):
202 vec1 = (position_vector(v3) - position_vector(v2)).normalized() 201 vec1 = (position_vector(v3) - position_vector(v2)).normalized()
203 vec2 = (position_vector(v1) - position_vector(v2)).normalized() 202 vec2 = (position_vector(v1) - position_vector(v2)).normalized()
204 if not isclose(vec1.length(), 0) and not isclose(vec2.length(), 0): 203 if not isclose(vec1.length(), 0) and not isclose(vec2.length(), 0):
205 cosine = dot_product(vec1, vec2) / vec1.length() / vec2.length() 204 cosine = dot_product(vec1, vec2) / vec1.length() / vec2.length()
206 yield acos(cosine) 205 yield cosine
207 @property 206 else:
208 def smallest_angle(self): 207 yield 1 # cos(0)
209 return min(
210 angle_magnitude_key(angle)
211 for angle in self.angles)
212 @property 208 @property
213 def hairline_ratio(self): 209 def hairline_ratio(self):
214 lengths = [line.length for line in self.perimeter_lines] 210 lengths = [line.length for line in self.perimeter_lines]
215 return max(lengths) / min(lengths) 211 return max(lengths) / min(lengths)
216 212

mercurial