tests/concave.py

Sun, 21 Jan 2018 15:03:38 +0200

author
Santeri Piippo
date
Sun, 21 Jan 2018 15:03:38 +0200
changeset 13
12d4ddc4bfd8
parent 12
eb74680a5e43
child 14
d383f319f35b
permissions
-rw-r--r--

Got the skew test working

from math import acos, degrees, radians, pi as π
from testsuite import warning, error
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.quadrilaterals:
        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')

def bowtie_quadrilateral_test(model):
    for quadrilateral in model.quadrilaterals:
        vertices = IndexRing(quadrilateral.geometry.vertices)
        for i in (0, 1):
            line1 = LineSegment(vertices[0 + i], vertices[1 + i])
            line2 = LineSegment(vertices[2 + i], vertices[3 + i])
            try:
                line_intersection(line1, line2)
            except NoIntersection:
                pass
            else:
                yield error(quadrilateral, 'Bowtie quadrilateral')
                break

def vector_angle(vec_1, vec_2, normalized = False):
    cosine = dot_product(vec_1, vec_2)
    try:
        cosine /= vec_1.length() * vec_2.length()
    except ZeroDivisionError:
        return 0
    angle = acos(cosine)
    if normalized and angle > π / 2:
        angle = π - angle
    return angle

def skew_test(model):
    for quadrilateral in model.quadrilaterals:
        vertices = IndexRing(quadrilateral.geometry.vertices)
        for i in (0, 1):
            a, b = vertices[0 + i], vertices[1 + i]
            c, d = vertices[2 + i], vertices[3 + i]
            plane_1 = cross_product(b - a, d - a)
            plane_2 = cross_product(d - c, b - c)
            angle = vector_angle(plane_1, plane_2, normalized = True)
            if angle > radians(0.1):
                yield error(quadrilateral,
                    'Skew quadrilateral (plane angle {}°)',
                    '%.3f' % degrees(angle))
                break

mercurial