Exemplo n.º 1
0
def bb_intersection_test():
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(2, 2)
    bba = geometry.BoundingBox(ap1, ap2)

    # Test 1
    bp1 = geometry.Point(1, 1)
    bp2 = geometry.Point(2, 2)
    bbb = geometry.BoundingBox(bp1, bp2)
    nose.tools.assert_equal(geometry.do_bb_intersect(bba, bbb), True)

    # Test 2
    bp1 = geometry.Point(2, 2)
    bp2 = geometry.Point(3, 3)
    bbb = geometry.BoundingBox(bp1, bp2)
    nose.tools.assert_equal(geometry.do_bb_intersect(bba, bbb), True)

    # Test 3
    bp1 = geometry.Point(1, 1)
    bp2 = geometry.Point(3, 3)
    bbb = geometry.BoundingBox(bp1, bp2)
    nose.tools.assert_equal(geometry.do_bb_intersect(bba, bbb), True)

    # Test 3
    bp1 = geometry.Point(3, 3)
    bp2 = geometry.Point(4, 4)
    bbb = geometry.BoundingBox(bp1, bp2)
    nose.tools.assert_equal(geometry.do_bb_intersect(bba, bbb), False)
Exemplo n.º 2
0
def test_bb_intersection():
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(2, 2)
    bba = geometry.BoundingBox(ap1, ap2)

    # Test 1
    bp1 = geometry.Point(1, 1)
    bp2 = geometry.Point(2, 2)
    bbb = geometry.BoundingBox(bp1, bp2)
    assert geometry.do_bb_intersect(bba, bbb)

    # Test 2
    bp1 = geometry.Point(2, 2)
    bp2 = geometry.Point(3, 3)
    bbb = geometry.BoundingBox(bp1, bp2)
    assert geometry.do_bb_intersect(bba, bbb)

    # Test 3
    bp1 = geometry.Point(1, 1)
    bp2 = geometry.Point(3, 3)
    bbb = geometry.BoundingBox(bp1, bp2)
    assert geometry.do_bb_intersect(bba, bbb)

    # Test 3
    bp1 = geometry.Point(3, 3)
    bp2 = geometry.Point(4, 4)
    bbb = geometry.BoundingBox(bp1, bp2)
    assert not geometry.do_bb_intersect(bba, bbb)
Exemplo n.º 3
0
 def _get_bb_distance(a, b):
     """"Take two bounding boxes a and b and get the smallest distance
         between them.
     """
     points_a = [geometry.Point(a.p1.x, a.p1.y),
                 geometry.Point(a.p1.x, a.p2.y),
                 geometry.Point(a.p2.x, a.p1.y),
                 geometry.Point(a.p2.x, a.p2.y)]
     points_b = [geometry.Point(b.p1.x, b.p1.y),
                 geometry.Point(b.p1.x, b.p2.y),
                 geometry.Point(b.p2.x, b.p1.y),
                 geometry.Point(b.p2.x, b.p2.y)]
     min_distance = points_a[0].dist_to(points_b[0])
     for pa in points_a:
         for pb in points_b:
             min_distance = min(min_distance, pa.dist_to(pb))
     lines_a = [geometry.LineSegment(points_a[0], points_a[1]),
                geometry.LineSegment(points_a[1], points_a[2]),
                geometry.LineSegment(points_a[2], points_a[3]),
                geometry.LineSegment(points_a[3], points_a[0])]
     lines_b = [geometry.LineSegment(points_b[0], points_b[1]),
                geometry.LineSegment(points_b[1], points_b[2]),
                geometry.LineSegment(points_b[2], points_b[3]),
                geometry.LineSegment(points_b[3], points_b[0])]
     for line_in_a in lines_a:
         for line_in_b in lines_b:
             min_distance = min(min_distance, line_in_a.dist_to(line_in_b))
     return min_distance
Exemplo n.º 4
0
def segment_intersection_test():
    l1 = geometry.LineSegment(geometry.Point(289, 69), geometry.Point(290, 69))
    l2 = geometry.LineSegment(geometry.Point(291, 69), geometry.Point(292, 69))
    nose.tools.assert_equal(geometry.get_segments_intersections(l1, l2), [])

    l1 = geometry.LineSegment(geometry.Point(0, 0), geometry.Point(0, 10))
    l2 = geometry.LineSegment(geometry.Point(5, 5), geometry.Point(2, 0))
    nose.tools.assert_equal(geometry.get_segments_intersections(l1, l2), [])
Exemplo n.º 5
0
def test_segment_intersection():
    l1 = geometry.LineSegment(geometry.Point(289, 69), geometry.Point(290, 69))
    l2 = geometry.LineSegment(geometry.Point(291, 69), geometry.Point(292, 69))
    assert geometry.get_segments_intersections(l1, l2) == []

    l1 = geometry.LineSegment(geometry.Point(0, 0), geometry.Point(0, 10))
    l2 = geometry.LineSegment(geometry.Point(5, 5), geometry.Point(2, 0))
    assert geometry.get_segments_intersections(l1, l2) == []
Exemplo n.º 6
0
 def _get_stroke_bounding_box(stroke):
     """Get the bounding box of a stroke. A stroke is a list of points
        {'x': 123, 'y': 456, 'time': 42} and a bounding box is the smallest
        rectangle that contains all points.
     """
     min_x, max_x = stroke[0]['x'], stroke[0]['x']
     min_y, max_y = stroke[0]['y'], stroke[0]['y']
     #  if len(stroke) == 1: ?
     for point in stroke:
         min_x = min(point['x'], min_x)
         max_x = max(point['x'], max_x)
         min_y = min(point['y'], min_y)
         max_y = max(point['y'], max_y)
     minp = geometry.Point(min_x, min_y)
     maxp = geometry.Point(max_x, max_y)
     return geometry.BoundingBox(minp, maxp)
Exemplo n.º 7
0
def test_object_creation():
    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(1, 1)
    assert str(p1) == "p(0.00, 0.00)"
    geometry.LineSegment(p1, p2)
    geometry.BoundingBox(p1, p2)
    geometry.PolygonalChain([{
        "x": 0,
        "y": 0
    }, {
        "x": 10,
        "y": 5
    }, {
        "x": 2,
        "y": 3
    }])
Exemplo n.º 8
0
def object_creation_test():
    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(1, 1)
    nose.tools.assert_equal(str(p1), "p(0.00, 0.00)")
    geometry.LineSegment(p1, p2)
    geometry.BoundingBox(p1, p2)
    geometry.PolygonalChain([{
        'x': 0,
        'y': 0
    }, {
        'x': 10,
        'y': 5
    }, {
        'x': 2,
        'y': 3
    }])
Exemplo n.º 9
0
def segments_distance_test():
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    la = geometry.LineSegment(ap1, ap2)

    # Test 1
    bp1 = geometry.Point(0, 1)
    bp2 = geometry.Point(1, 1)
    lb = geometry.LineSegment(bp1, bp2)
    nose.tools.assert_equal(geometry.segments_distance(la, lb), 1.0)

    # Test 2: Line segements cross
    bp1 = geometry.Point(0.5, 0.5)
    bp2 = geometry.Point(0.5, -0.5)
    lb = geometry.LineSegment(bp1, bp2)
    nose.tools.assert_equal(geometry.segments_distance(la, lb), 0)
Exemplo n.º 10
0
def test_segments_distance():
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    la = geometry.LineSegment(ap1, ap2)

    # Test 1
    bp1 = geometry.Point(0, 1)
    bp2 = geometry.Point(1, 1)
    lb = geometry.LineSegment(bp1, bp2)
    assert geometry.segments_distance(la, lb) == 1.0

    # Test 2: Line segements cross
    bp1 = geometry.Point(0.5, 0.5)
    bp2 = geometry.Point(0.5, -0.5)
    lb = geometry.LineSegment(bp1, bp2)
    assert geometry.segments_distance(la, lb) == 0
Exemplo n.º 11
0
def test_line_segment_parallel_distance():
    """Test the distance of two parallel line segments."""
    # TODO: Other tests!
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    la = geometry.LineSegment(ap1, ap2)

    bp1 = geometry.Point(0, 1)
    bp2 = geometry.Point(1, 1)
    lb = geometry.LineSegment(bp1, bp2)

    assert la.dist_to(lb) == 1

    bp1 = geometry.Point(0, 2)
    bp2 = geometry.Point(1, 2)
    lb = geometry.LineSegment(bp1, bp2)

    assert la.dist_to(lb) == 2

    bp1 = geometry.Point(1, 2)
    bp2 = geometry.Point(2, 2)
    lb = geometry.LineSegment(bp1, bp2)

    assert la.dist_to(lb) == 2
Exemplo n.º 12
0
def line_segment_parallel_distance_test():
    """Test the distance of two parallel line segments."""
    # TODO: Other tests!
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    la = geometry.LineSegment(ap1, ap2)

    bp1 = geometry.Point(0, 1)
    bp2 = geometry.Point(1, 1)
    lb = geometry.LineSegment(bp1, bp2)

    nose.tools.assert_equal(la.dist_to(lb), 1)

    bp1 = geometry.Point(0, 2)
    bp2 = geometry.Point(1, 2)
    lb = geometry.LineSegment(bp1, bp2)

    nose.tools.assert_equal(la.dist_to(lb), 2)

    bp1 = geometry.Point(1, 2)
    bp2 = geometry.Point(2, 2)
    lb = geometry.LineSegment(bp1, bp2)

    nose.tools.assert_equal(la.dist_to(lb), 2)
Exemplo n.º 13
0
def test_bounding_box():
    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(1, 1)
    bb = geometry.BoundingBox(p1, p2)
    assert bb.get_area() == 1
    assert bb.get_width() == 1
    assert bb.get_height() == 1
    assert bb.get_largest_dimension() == 1

    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(2, 2)
    bb = geometry.BoundingBox(p1, p2)
    assert bb.get_area() == 4
    assert bb.get_width() == 2
    assert bb.get_height() == 2
    assert bb.get_largest_dimension() == 2

    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(3, 2)
    bb = geometry.BoundingBox(p1, p2)
    assert bb.get_area() == 6
    assert bb.get_width() == 3
    assert bb.get_height() == 2
    assert bb.get_largest_dimension() == 3
Exemplo n.º 14
0
def bounding_box_test():
    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(1, 1)
    bb = geometry.BoundingBox(p1, p2)
    nose.tools.assert_equal(bb.get_area(), 1)
    nose.tools.assert_equal(bb.get_width(), 1)
    nose.tools.assert_equal(bb.get_height(), 1)
    nose.tools.assert_equal(bb.get_largest_dimension(), 1)

    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(2, 2)
    bb = geometry.BoundingBox(p1, p2)
    nose.tools.assert_equal(bb.get_area(), 4)
    nose.tools.assert_equal(bb.get_width(), 2)
    nose.tools.assert_equal(bb.get_height(), 2)
    nose.tools.assert_equal(bb.get_largest_dimension(), 2)

    p1 = geometry.Point(0, 0)
    p2 = geometry.Point(3, 2)
    bb = geometry.BoundingBox(p1, p2)
    nose.tools.assert_equal(bb.get_area(), 6)
    nose.tools.assert_equal(bb.get_width(), 3)
    nose.tools.assert_equal(bb.get_height(), 2)
    nose.tools.assert_equal(bb.get_largest_dimension(), 3)
Exemplo n.º 15
0
def point_segment_distance_test():
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap1, ap2)

    # Test 1
    point = geometry.Point(0, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 0.0)

    # Test 2
    point = geometry.Point(0, 1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    # Test 3: Line segement is just a point
    line = geometry.LineSegment(ap1, ap1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    # Test 3: Line segement is a straight vertical line
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(1, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    point = geometry.Point(0, 2)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    point = geometry.Point(0, -1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap2 = geometry.Point(0, 0)
    ap1 = geometry.Point(0, 1)
    point = geometry.Point(0, -1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(0, -1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(0, 2)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(2, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(2, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(-1, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(-1, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 1.0)

    # Test 3: Line segement is a straight vertical line and point is on it
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(0, 0.1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 0)

    # Test 4: Vertical line tests
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(0.5, 0.5)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 0.5)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(-0.5, 0.5)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line), 0.5)

    # Test 5: Other
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(1, 0)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line),
                            (2**0.5) / 2.0)

    # Test 6: Continued line
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(2, 2)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line),
                            2**0.5)

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(-1, -1)
    nose.tools.assert_equal(geometry.point_segment_distance(point, line),
                            2**0.5)
Exemplo n.º 16
0
def test_segments_intersection():
    l1 = geometry.LineSegment(geometry.Point(0, 0), geometry.Point(2, 2))
    l2 = geometry.LineSegment(geometry.Point(1, 1), geometry.Point(3, 3))
    assert geometry.get_segments_intersections(l1,
                                               l2) == [geometry.Point(1, 1)]

    l1 = geometry.LineSegment(geometry.Point(0, 0), geometry.Point(2, 2))
    l2 = geometry.LineSegment(geometry.Point(2.1, 2.1), geometry.Point(3, 3))
    assert geometry.get_segments_intersections(l1, l2) == []

    # 2 vertical line segments
    l1 = geometry.LineSegment(geometry.Point(42, 2), geometry.Point(42, 0))
    l2 = geometry.LineSegment(geometry.Point(42, 1), geometry.Point(42, -1))
    assert geometry.get_segments_intersections(l1,
                                               l2) == [geometry.Point(42, 0)]

    l1 = geometry.LineSegment(geometry.Point(-1, 0), geometry.Point(1, 0))
    l2 = geometry.LineSegment(geometry.Point(0, -1), geometry.Point(0, 1))
    assert geometry.get_segments_intersections(l1,
                                               l2) == [geometry.Point(0, 0)]
Exemplo n.º 17
0
def test_point_distance():
    a = geometry.Point(0, 0)
    b = geometry.Point(42, 0)
    assert a.dist_to(b) == 42
    assert b.dist_to(a) == 42
Exemplo n.º 18
0
def test_point_segment_distance():
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap1, ap2)

    # Test 1
    point = geometry.Point(0, 0)
    assert geometry.point_segment_distance(point, line) == 0.0

    # Test 2
    point = geometry.Point(0, 1)
    assert geometry.point_segment_distance(point, line) == 1.0

    # Test 3: Line segement is just a point
    line = geometry.LineSegment(ap1, ap1)
    assert geometry.point_segment_distance(point, line) == 1.0

    # Test 3: Line segement is a straight vertical line
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(1, 0)
    assert geometry.point_segment_distance(point, line) == 1.0

    point = geometry.Point(0, 2)
    assert geometry.point_segment_distance(point, line) == 1.0

    point = geometry.Point(0, -1)
    assert geometry.point_segment_distance(point, line) == 1.0

    ap2 = geometry.Point(0, 0)
    ap1 = geometry.Point(0, 1)
    point = geometry.Point(0, -1)
    assert geometry.point_segment_distance(point, line), 1.0

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(0, -1)
    assert geometry.point_segment_distance(point, line) == 1.0

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(0, 2)
    assert geometry.point_segment_distance(point, line) == 1.0

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(2, 0)
    assert geometry.point_segment_distance(point, line) == 1.0

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(2, 0)
    assert geometry.point_segment_distance(point, line) == 1.0

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(-1, 0)
    assert geometry.point_segment_distance(point, line) == 1.0

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 0)
    line = geometry.LineSegment(ap2, ap1)
    point = geometry.Point(-1, 0)
    assert geometry.point_segment_distance(point, line) == 1.0

    # Test 3: Line segement is a straight vertical line and point is on it
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(0, 0.1)
    assert geometry.point_segment_distance(point, line) == 0

    # Test 4: Vertical line tests
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(0.5, 0.5)
    assert geometry.point_segment_distance(point, line) == 0.5

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(0, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(-0.5, 0.5)
    assert geometry.point_segment_distance(point, line) == 0.5

    # Test 5: Other
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(1, 0)
    assert geometry.point_segment_distance(point, line) == (2**0.5) / 2.0

    # Test 6: Continued line
    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(2, 2)
    assert geometry.point_segment_distance(point, line) == 2**0.5

    ap1 = geometry.Point(0, 0)
    ap2 = geometry.Point(1, 1)
    line = geometry.LineSegment(ap1, ap2)
    point = geometry.Point(-1, -1)
    assert geometry.point_segment_distance(point, line) == 2**0.5
Exemplo n.º 19
0
def segments_intersection_test():
    l1 = geometry.LineSegment(geometry.Point(0, 0), geometry.Point(2, 2))
    l2 = geometry.LineSegment(geometry.Point(1, 1), geometry.Point(3, 3))
    nose.tools.assert_equal(geometry.get_segments_intersections(l1, l2),
                            [geometry.Point(1, 1)])

    l1 = geometry.LineSegment(geometry.Point(0, 0), geometry.Point(2, 2))
    l2 = geometry.LineSegment(geometry.Point(2.1, 2.1), geometry.Point(3, 3))
    nose.tools.assert_equal(geometry.get_segments_intersections(l1, l2), [])

    # 2 vertical line segments
    l1 = geometry.LineSegment(geometry.Point(42, 2), geometry.Point(42, 0))
    l2 = geometry.LineSegment(geometry.Point(42, 1), geometry.Point(42, -1))
    nose.tools.assert_equal(geometry.get_segments_intersections(l1, l2),
                            [geometry.Point(42, 0)])

    l1 = geometry.LineSegment(geometry.Point(-1, 0), geometry.Point(1, 0))
    l2 = geometry.LineSegment(geometry.Point(0, -1), geometry.Point(0, 1))
    nose.tools.assert_equal(geometry.get_segments_intersections(l1, l2),
                            [geometry.Point(0, 0)])
Exemplo n.º 20
0
def get_bounding_box_distance(raw_datasets):
    """Get the distances between bounding boxes of strokes of a single symbol.
       Can only be applied to recordings with at least two strokes.
    """

    # TODO: Deal with http://www.martin-thoma.de/write-math/symbol/?id=167
    # 193
    # 524

    def _get_stroke_bounding_box(stroke):
        """Get the bounding box of a stroke. A stroke is a list of points
           {'x': 123, 'y': 456, 'time': 42} and a bounding box is the smallest
           rectangle that contains all points.
        """
        min_x, max_x = stroke[0]['x'], stroke[0]['x']
        min_y, max_y = stroke[0]['y'], stroke[0]['y']
        #  if len(stroke) == 1: ?
        for point in stroke:
            min_x = min(point['x'], min_x)
            max_x = max(point['x'], max_x)
            min_y = min(point['y'], min_y)
            max_y = max(point['y'], max_y)
        minp = geometry.Point(min_x, min_y)
        maxp = geometry.Point(max_x, max_y)
        return geometry.BoundingBox(minp, maxp)

    def _get_bb_distance(a, b):
        """"Take two bounding boxes a and b and get the smallest distance
            between them.
        """
        points_a = [geometry.Point(a.p1.x, a.p1.y),
                    geometry.Point(a.p1.x, a.p2.y),
                    geometry.Point(a.p2.x, a.p1.y),
                    geometry.Point(a.p2.x, a.p2.y)]
        points_b = [geometry.Point(b.p1.x, b.p1.y),
                    geometry.Point(b.p1.x, b.p2.y),
                    geometry.Point(b.p2.x, b.p1.y),
                    geometry.Point(b.p2.x, b.p2.y)]
        min_distance = points_a[0].dist_to(points_b[0])
        for pa in points_a:
            for pb in points_b:
                min_distance = min(min_distance, pa.dist_to(pb))
        lines_a = [geometry.LineSegment(points_a[0], points_a[1]),
                   geometry.LineSegment(points_a[1], points_a[2]),
                   geometry.LineSegment(points_a[2], points_a[3]),
                   geometry.LineSegment(points_a[3], points_a[0])]
        lines_b = [geometry.LineSegment(points_b[0], points_b[1]),
                   geometry.LineSegment(points_b[1], points_b[2]),
                   geometry.LineSegment(points_b[2], points_b[3]),
                   geometry.LineSegment(points_b[3], points_b[0])]
        for line_in_a in lines_a:
            for line_in_b in lines_b:
                min_distance = min(min_distance, line_in_a.dist_to(line_in_b))
        return min_distance

    bbfile = open("bounding_boxdist.html", "a")
    start_time = time.time()
    for i, raw_dataset in enumerate(raw_datasets):
        if i % 100 == 0 and i > 0:
            utils.print_status(len(raw_datasets), i, start_time)
        pointlist = raw_dataset['handwriting'].get_pointlist()
        if len(pointlist) < 2:
            continue
        bounding_boxes = []
        for stroke in pointlist:
            # TODO: Get bounding boxes of strokes
            bounding_boxes.append(_get_stroke_bounding_box(stroke))

        got_change = True
        while got_change:
            got_change = False
            i = 0
            while i < len(bounding_boxes):
                j = i + 1
                while j < len(bounding_boxes):
                    if geometry.do_bb_intersect(bounding_boxes[i],
                                                bounding_boxes[j]):
                        got_change = True
                        new_bounding_boxes = []
                        p1x = min(bounding_boxes[i].p1.x,
                                  bounding_boxes[j].p1.x)
                        p1y = min(bounding_boxes[i].p1.y,
                                  bounding_boxes[j].p1.y)
                        p2x = max(bounding_boxes[i].p2.x,
                                  bounding_boxes[j].p2.x)
                        p2y = max(bounding_boxes[i].p2.y,
                                  bounding_boxes[j].p2.y)
                        p1 = geometry.Point(p1x, p1y)
                        p2 = geometry.Point(p2x, p2y)
                        new_bounding_boxes.append(geometry.BoundingBox(p1, p2))
                        for k in range(len(bounding_boxes)):
                            if k != i and k != j:
                                new_bounding_boxes.append(bounding_boxes[k])
                        bounding_boxes = new_bounding_boxes
                    j += 1
                i += 1

        # sort bounding boxes (decreasing) by size
        bounding_boxes = sorted(bounding_boxes,
                                key=lambda bbox: bbox.get_area(),
                                reverse=True)

        # Bounding boxes have been merged as far as possible
        # check their distance and compare it with the highest dimension
        # (length/height) of the biggest bounding box
        if len(bounding_boxes) != 1:
            bb_dist = []
            for k, bb in enumerate(bounding_boxes):
                dist_tmp = []
                for j, bb2 in enumerate(bounding_boxes):
                    if k == j:
                        continue
                    dist_tmp.append(_get_bb_distance(bb, bb2))
                bb_dist.append(min(dist_tmp))
            bb_dist = max(bb_dist)
            dim = max([bb.get_largest_dimension() for bb in bounding_boxes])
            if bb_dist > 1.5*dim:
                # bounding_box_h = raw_dataset['handwriting'].get_bounding_box()
                # bbsize = (bounding_box_h['maxx'] - bounding_box_h['minx']) * \
                #          (bounding_box_h['maxy'] - bounding_box_h['miny'])
                if raw_dataset['handwriting'].formula_id not in \
                   [635, 636, 936, 992, 260, 941, 934, 184] and \
                   raw_dataset['handwriting'].wild_point_count == 0 and \
                   raw_dataset['handwriting'].missing_stroke == 0:
                    # logging.debug("bb_dist: %0.2f" % bb_dist)
                    # logging.debug("dim: %0.2f" % dim)
                    # for bb in bounding_boxes:
                    #     print(bb)
                    #     print("width: %0.2f" % bb.get_width())
                    #     print("height: %0.2f" % bb.get_height())
                    #     print("maxdim: %0.2f" % bb.get_largest_dimension())
                    # bb_dist = []
                    # for k, bb in enumerate(bounding_boxes):
                    #     dist_tmp = []
                    #     for j, bb2 in enumerate(bounding_boxes):
                    #         if k == j:
                    #             continue
                    #         dist_tmp.append(_get_bb_distance(bb, bb2))
                    #     print(dist_tmp)
                    #     bb_dist.append(min(dist_tmp))
                    # raw_dataset['handwriting'].show()
                    # exit()
                    url_base = "http://www.martin-thoma.de/write-math/view"
                    bbfile.write("<a href='%s/?raw_data_id=%i'>a</a>\n" %
                                 (url_base,
                                  raw_dataset['handwriting'].raw_data_id))
    print("\r100%"+"\033[K\n")
Exemplo n.º 21
0
def point_distance_test():
    a = geometry.Point(0, 0)
    b = geometry.Point(42, 0)
    nose.tools.assert_equal(a.dist_to(b), 42)
    nose.tools.assert_equal(b.dist_to(a), 42)