49 intersection = line_segment_intersection_xy(line_1, line_2) |
49 intersection = line_segment_intersection_xy(line_1, line_2) |
50 if intersection: |
50 if intersection: |
51 yield error(quadrilateral, 'self-intersecting') |
51 yield error(quadrilateral, 'self-intersecting') |
52 break |
52 break |
53 |
53 |
|
54 def collinear_test(model): |
|
55 for element in model.body: |
|
56 if hasattr(element, 'geometry') and len(element.geometry.vertices) >= 3: |
|
57 for a, b, c in pairs(element.geometry.vertices, count = 3): |
|
58 if cross_product(b - a, c - a).length() < 1e-5: |
|
59 yield error(element, 'collinearity-error') |
|
60 |
54 manifest = { |
61 manifest = { |
55 'tests': { |
62 'tests': { |
56 'skew': skew_test, |
63 'skew': skew_test, |
57 'concave': concave_test, |
64 'concave': concave_test, |
58 'bowtie': bowtie_test, |
65 'bowtie': bowtie_test, |
|
66 'collinearity': collinear_test, |
59 }, |
67 }, |
60 'messages': { |
68 'messages': { |
61 'skew-error': lambda skew_angle: |
69 'skew-error': lambda skew_angle: |
62 str.format('skew quadrilateral (plane angle {})', |
70 str.format('skew quadrilateral (plane angle {})', |
63 degree_rep(skew_angle), |
71 degree_rep(skew_angle), |
66 str.format('slightly skew quadrilateral (plane angle {})', |
74 str.format('slightly skew quadrilateral (plane angle {})', |
67 degree_rep(skew_angle), |
75 degree_rep(skew_angle), |
68 ), |
76 ), |
69 'concave-error': 'concave quadrilateral', |
77 'concave-error': 'concave quadrilateral', |
70 'self-intersecting': 'bowtie quadrilateral', |
78 'self-intersecting': 'bowtie quadrilateral', |
|
79 'collinearity-error': 'collinear polygon', |
71 }, |
80 }, |
72 } |
81 } |