tests/quadrilaterals.py

changeset 28
5933250813a3
parent 27
3089611c99d1
child 30
0d9ca37901ed
--- 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',
     },
 }

mercurial