geometry.py

changeset 90
6ae063fd27dc
parent 62
f0a6bf48b05e
child 92
b8d72909d593
equal deleted inserted replaced
89:d2b277cb948e 90:6ae063fd27dc
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 @property
199 def angles(self): 199 def angles(self):
200 from math import acos 200 from math import acos, isclose
201 for v1, v2, v3 in pairs(self.vertices, count = 3): 201 for v1, v2, v3 in pairs(self.vertices, count = 3):
202 vec1 = (position_vector(v3) - position_vector(v2)).normalized() 202 vec1 = (position_vector(v3) - position_vector(v2)).normalized()
203 vec2 = (position_vector(v1) - position_vector(v2)).normalized() 203 vec2 = (position_vector(v1) - position_vector(v2)).normalized()
204 cosine = dot_product(vec1, vec2) / vec1.length() / vec2.length() 204 if not isclose(vec1.length(), 0) and not isclose(vec2.length(), 0):
205 yield acos(cosine) 205 cosine = dot_product(vec1, vec2) / vec1.length() / vec2.length()
206 yield acos(cosine)
206 @property 207 @property
207 def smallest_angle(self): 208 def smallest_angle(self):
208 return min( 209 return min(
209 angle_magnitude_key(angle) 210 angle_magnitude_key(angle)
210 for angle in self.angles) 211 for angle in self.angles)

mercurial