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