# HG changeset patch # User Santeri Piippo # Date 1516362083 -7200 # Node ID eb74680a5e43cd10354eb1a9aaf482b2f8036e4f # Parent b42788f5d0a9302cdde317dee041d9218fe58691 commit work done on test suites... diff -r b42788f5d0a9 -r eb74680a5e43 geometry.py --- a/geometry.py Tue Jan 16 17:29:40 2018 +0200 +++ b/geometry.py Fri Jan 19 13:41:23 2018 +0200 @@ -188,15 +188,18 @@ for v1, v2 in pairs(self.vertices): yield LineSegment(v1, v2) @property - def smallest_angle(self): - from math import acos, inf - min_angle = inf + def angles(self): + from math import acos for v1, v2, v3 in pairs(self.vertices, count = 3): vec1 = (position_vector(v3) - position_vector(v2)).normalized() vec2 = (position_vector(v1) - position_vector(v2)).normalized() cosine = dot_product(vec1, vec2) / vec1.length() / vec2.length() - min_angle = min(min_angle, angle_magnitude_key(acos(cosine))) - return min_angle + yield acos(cosine) + @property + def smallest_angle(self): + return min( + angle_magnitude_key(angle) + for angle in self.angles) @property def hairline_ratio(self): lengths = [line.length for line in self.perimeter_lines] diff -r b42788f5d0a9 -r eb74680a5e43 tests/concave.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/concave.py Fri Jan 19 13:41:23 2018 +0200 @@ -0,0 +1,22 @@ +from math import degrees, pi as π +from testsuite import warning +from geometry import * + +def sign_consistency(container): + # Returns whether all elements in container have the same sign + return min(container) * max(container) >= 0 + +def transform_to_xy(geometry): + a, b, c = geometry.vertices[:3] + + +def concave_test(model): + for quadrilateral in model: + print([cross_product(v2 - v1, v3 - v1) for v1, v2, v3 in pairs(quadrilateral.geometry.vertices, count = 3)]) + z_scores = [ + cross_product(v2 - v1, v3 - v1).z + for v1, v2, v3 in pairs(quadrilateral.geometry.vertices, count = 3) + ] + print(z_scores) + if not sign_consistency(z_scores): + yield warning(quadrilateral, 'Concave quadrilateral') \ No newline at end of file diff -r b42788f5d0a9 -r eb74680a5e43 testsuite.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testsuite.py Fri Jan 19 13:41:23 2018 +0200 @@ -0,0 +1,6 @@ +def warning(object, *message): + return { + 'type': 'warning', + 'object': object, + 'message': str.format(*message), + } \ No newline at end of file