diff -r 3089611c99d1 -r 5933250813a3 tests/quadrilaterals.py --- a/tests/quadrilaterals.py Tue Jan 23 12:29:30 2018 +0200 +++ b/tests/quadrilaterals.py Tue Jan 23 14:09:44 2018 +0200 @@ -9,7 +9,11 @@ def concave_test(model): ''' Checks that all quadrilaterals are convex. ''' for quadrilateral in model.quadrilaterals: + # Rotate the polygon into the XY plane. Then z is facing + # away from the quadrilateral. geometry = transform_to_xy(quadrilateral.geometry) + # Now do a 2D concavity test: + # https://math.stackexchange.com/a/1745427 z_scores = [ cross_product(v2 - v1, v3 - v1).z for v1, v2, v3 in pairs(geometry.vertices, count = 3) @@ -35,10 +39,23 @@ ) break +def bowtie_test(model): + for quadrilateral in model.quadrilaterals: + geometry = transform_to_xy(quadrilateral.geometry) + vertices = IndexRing(geometry.vertices) + for i in (0, 1): + line_1 = LineSegment(vertices[0 + i], vertices[1 + i]) + line_2 = LineSegment(vertices[2 + i], vertices[3 + i]) + intersection = line_segment_intersection_xy(line_1, line_2) + if intersection: + yield error(quadrilateral, 'self-intersecting') + break + manifest = { 'tests': { 'skew': skew_test, 'concave': concave_test, + 'bowtie': bowtie_test, }, 'messages': { 'skew-error': lambda skew_angle: @@ -50,5 +67,6 @@ degree_rep(skew_angle), ), 'concave-error': 'concave quadrilateral', + 'self-intersecting': 'bowtie quadrilateral', }, }