def test_line_line():
    l1 = Line(1, 1, 0)
    l2 = Line(1, -1, 0)

    assert {P2(0, 0)} == intersect(l1, l2)

    assert {P2(1, 1)} == intersect(l2, Line(1, 1, 2))
def test_circle_circle():
    # functionality tested in test_r2_circle

    circle1 = Circle(100, P2(0, 0))
    circle2 = Circle(100, P2(100, 100))

    assert {P2(0.0, 100.0), P2(100.0, 0.0)} == intersect(circle1, circle2)
예제 #3
0
def test_does_intersect_circle_circle():

    c1 = Circle(100)
    c2 = Circle(100, P2(500, 500))
    assert not does_intersect(c1, c2)
    assert not does_intersect(c1, Circle(50))

    assert does_intersect(c1, Circle(100, P2(10, 10)))
def test_parallel_y():
    line = Line.ByPoints(P2(0, 0), P2(1, 0))

    up_one = line.parallel(P2(1, 1))

    assert up_one == line.parallel(P2(0, 1))

    assert up_one.y(-1) == 1
    assert up_one.y(1) == 1
예제 #5
0
def test_circle_intersection(circle_00, circle_11):
    far_circle = Circle(100, P2(500, 500))

    with pytest.raises(ValueError):
        circle_00.intersection(circle_00)

    with pytest.raises(TypeError):
        circle_00.intersection(None)

    assert circle_00.intersection(far_circle) == set()
    assert far_circle.intersection(circle_00) == set()

    contained_circle = Circle(50)

    assert circle_00.intersection(contained_circle) == set()
    assert contained_circle.intersection(circle_00) == set()

    tangent_circle = Circle(100, P2(200, 0))
    assert circle_00.intersection(tangent_circle) == {P2(100.0, 0.0)}
    assert tangent_circle.intersection(circle_00) == {P2(100.0, 0.0)}

    intersecting_circle = Circle(100, P2(101, 101))
    assert intersecting_circle.intersection(circle_11) == {
        P2(101.0, 1.0),
        P2(1.0, 101.0),
    }
    assert circle_11.intersection(intersecting_circle) == {
        P2(101.0, 1.0),
        P2(1.0, 101.0),
    }
예제 #6
0
def test_line_segment_rotate():
    ls = LineSegment(P2(-10, -10), P2(10, 10))
    assert ls.rotate(math.pi / 2) == LineSegment(P2(-10, 10), P2(10, -10))

    ls = LineSegment(P2(0, 0), P2(10, 10))
    assert ls.rotate(math.pi / 2, P2(5,
                                     5)) == LineSegment(P2(0, 10), P2(10, 0))
def test_line_contains_point():

    line = Line(1, 1, 0)

    assert line.contains(P2(0, 0))
    assert line.contains(P2(-1, 1))
    assert line.contains(P2(1, -1))

    assert not line.contains(P2(0, 1))

    assert not line.contains(V2(0, 0))
def test_p2_ordering():
    assert P2(0, 0) < P2(1, 1)
    assert P2(0, 0) < P2(1, 0)
    assert P2(0, 0) < P2(1, -1)

    assert P2(0, 0) > P2(0, -1)

    with pytest.raises(TypeError):
        P2(0, 0) >= V2(0, 0)

    with pytest.raises(TypeError):
        P2(0, 0) > None
예제 #9
0
def test_line_segment_center():
    ls = LineSegment(P2(-10, 10), P2(10, 10))
    assert P2(0, 10) == ls.center()

    ls = LineSegment(P2(10, -10), P2(10, 10))
    assert P2(10, 0) == ls.center()

    ls = LineSegment(P2(-10, -10), P2(10, 10))
    assert P2(0, 0) == ls.center()
예제 #10
0
def test_circle_create(circle_00, circle_11):

    with pytest.raises(ValueError):
        Circle(0)

    with pytest.raises(ValueError):
        Circle(-100)

    assert circle_00.center == P2(0, 0)
    assert circle_00.radius == 100

    assert circle_11.center == P2(1, 1)
    assert circle_11.radius == 100
예제 #11
0
def test_line_segment_line():
    ls = LineSegment(P2(0, 0), P2(10, 10))

    assert ls.line() == LineSegment(P2(-10, -10), P2(10, 10)).line()
    assert ls.line() == LineSegment(P2(100, 100), P2(200, 200)).line()

    assert ls.line() != LineSegment(P2(-10, -10), P2(1, 0)).line()
예제 #12
0
def test_line_intersection():

    l1 = Line(1, 1, 0)
    l2 = Line(1, -1, 0)

    assert l1.intersection(l2) == P2(0, 0)
    assert l2.intersection(l1) == P2(0, 0)

    l3 = Line(1, 1, 1)

    assert l1.intersection(l3) is None

    with pytest.raises(TypeError):
        l1.intersection(None)
예제 #13
0
def test_rasterize_polygon_10(square):
    expected = ApproxSet([
        P2(0, 0),
        P2(0.5, 0),
        P2(1, 0),
        P2(1, 0.3333333),
        P2(1, 0.6666666),
        P2(1, 1),
        P2(0.5, 1),
        P2(0, 1),
        P2(0, 0.6666666),
        P2(0, 0.3333333),
    ])
    assert expected == rasterize(square, n=10)
def test_p2_quadrant():
    assert 1 == P2(1, 1).quadrant()
    assert 1 == P2(0, 0).quadrant()
    assert 1 == P2(0, 1).quadrant()
    assert 1 == P2(1, 0).quadrant()

    assert 2 == P2(-1, 1).quadrant()
    assert 2 == P2(-1, 0).quadrant()

    assert 3 == P2(-1, -1).quadrant()
    assert 3 == P2(0, -1).quadrant()

    assert 4 == P2(1, -1).quadrant()
예제 #15
0
def test_does_intersect_line_segment_line_segment():
    ls45 = LineSegment(P2(-1, -1), P2(1, 1))
    ls135 = LineSegment(P2(-1, 1), P2(1, -1))
    assert does_intersect(ls45, ls135)

    ls135_up2 = LineSegment(P2(-1, 3), P2(1, 1))
    assert does_intersect(ls45, ls135_up2)

    ls135_up3 = LineSegment(P2(-1, 4), P2(1, 2))
    assert not does_intersect(ls45, ls135_up3)
def test_line_segment_line_segment():
    ls1 = LineSegment(P2(0, 0), P2(10, 10))
    ls2 = LineSegment(P2(0, 10), P2(10, 0))

    assert {P2(5, 5)} == intersect(ls1, ls2)
    assert {P2(5, 5)} == intersect(ls2, ls1)

    with pytest.raises(NotImplementedError):
        intersect(ls1, None)

    assert set() == intersect(ls1, LineSegment(P2(0, 5), P2(5, 10)))
예제 #17
0
def test_approx_set_contains():

    pset = ApproxSet({P2(0, 0), P2(1, 1), P2(3, 3)})

    assert P2(0, 0) in pset
    assert P2(0.0, 0.0) in pset
    assert P2(0.0000001, 0.0000001) in pset

    assert P2(0.1, 0.1) not in pset

    assert P2(-1, -1) not in pset
    assert P2(10, 10) not in pset

    with pytest.raises(TypeError):
        ApproxSet({V2(0, 0), V2(1, 1)})
예제 #18
0
def test_rasterize_polygon_8(square):
    expected = ApproxSet([
        P2(0, 0),
        P2(0.5, 0),
        P2(1, 0),
        P2(1, 0.5),
        P2(1, 1),
        P2(0.5, 1),
        P2(0, 1),
        P2(0, 0.5),
    ])
    assert expected == rasterize(square, n=8)
예제 #19
0
def test_translate():
    line = Line(2, 1, 2)
    assert line.y(0) == pytest.approx(2)
    assert line.x(0) == pytest.approx(1)

    translated = line.translate(V2(1, 1))
    assert translated.y(0) == pytest.approx(3)
    assert translated.x(0) == pytest.approx(2)

    horz = Line.ByPoints(P2(-1, 10), P2(1, 10))
    assert horz.y(0) == pytest.approx(10)

    translated = horz.translate(V2(1, 1))
    assert translated.y(0) == pytest.approx(11)

    vert = Line.ByPoints(P2(10, -1), P2(10, 1))
    assert vert.x(0) == pytest.approx(10)

    translated = vert.translate(V2(1, 1))
    assert translated.x(0) == pytest.approx(11)
예제 #20
0
def test_degenerate_cases():
    vert = Line.ByPoints(P2(1, 1), P2(1, -1))

    assert vert.y(1) is None
    assert vert.y(-100) is None
    assert vert.x(-1) == pytest.approx(1)
    assert vert.x(1) == pytest.approx(1)
    assert vert.x(-100) == pytest.approx(1)
    assert vert.x(100) == pytest.approx(1)

    horz = Line.ByPoints(P2(-1, 0), P2(1, 0))

    assert horz.y(-1) == pytest.approx(0)
    assert horz.y(1) == pytest.approx(0)
    assert horz.y(-100) == pytest.approx(0)
    assert horz.y(100) == pytest.approx(0)

    assert horz.x(-1) is None
    assert horz.x(1) is None
    assert horz.x(-100) is None
    assert horz.x(100) is None
def test_p2_add():

    assert P2(1, 1) == P2(0, 0) + V2(1, 1)
    assert P2(1, 1) == V2(1, 1) + P2(0, 0)

    with pytest.raises(TypeError):
        P2(0, 0) + P2(1, 1)
예제 #22
0
def test_line_segment_create():
    ls1 = LineSegment(P2(0, 0), P2(10, 10))
    ls2 = LineSegment(P2(10, 10), P2(0, 0))

    assert ls1 == ls2

    with pytest.raises(ValueError):
        LineSegment(P2(1, 1), P2(1, 1))
예제 #23
0
def test_contains(circle_00, circle_11):

    assert circle_00.contains(P2(0, 0))
    assert circle_11.contains(P2(0, 0))

    assert circle_00.contains(P2(-100, 0))
    assert circle_00.contains(P2(100, 0))
    assert circle_00.contains(P2(0, 100))
    assert circle_00.contains(P2(0, -100))

    assert not circle_00.contains(None)

    assert not circle_00.contains(P2(150, 0))
    assert not circle_00.contains(P2(0, 150))

    assert not circle_11.contains(V2(0, 0))
예제 #24
0
def test_line_segment_length():
    ls = LineSegment(P2(0, 0), P2(10, 0))
    assert 10 == ls.length()

    ls = LineSegment(P2(0, 0), P2(0, 10))
    assert 10 == ls.length()

    ls = LineSegment(P2(-10, -10), P2(10, 10))
    assert 800**0.5 == ls.length()
예제 #25
0
def test_create_from_points():
    l = Line.ByPoints(P2(-1, -1), P2(1, 1))

    assert l.y(1) == pytest.approx(1)
    assert l.y(-1) == pytest.approx(-1)
    assert l.x(1) == pytest.approx(1)
    assert l.x(-1) == pytest.approx(-1)

    assert l.y(25) == pytest.approx(25)
    assert l.y(-25) == pytest.approx(-25)
    assert l.x(25) == pytest.approx(25)
    assert l.x(-25) == pytest.approx(-25)

    l = Line.ByPoints(P2(-1, 1), P2(1, -1))

    assert l.y(1) == pytest.approx(-1)
    assert l.y(-1) == pytest.approx(1)
    assert l.x(1) == pytest.approx(-1)
    assert l.x(-1) == pytest.approx(1)

    assert l.y(25) == pytest.approx(-25)
    assert l.y(-25) == pytest.approx(25)
    assert l.x(25) == pytest.approx(-25)
    assert l.x(-25) == pytest.approx(25)
예제 #26
0
def test_does_intersect_circle_line_segment():
    circle = Circle(100)

    ls_right = LineSegment(P2(50, 0), P2(150, 0))
    assert does_intersect(circle, ls_right)
    assert does_intersect(ls_right, circle)

    ls_left = LineSegment(P2(-50, -50), P2(-100, -100))
    assert does_intersect(circle, ls_left)
    assert does_intersect(ls_left, circle)

    ls_inside = LineSegment(P2(-25, -25), P2(25, 25))
    assert not does_intersect(circle, ls_inside)
    assert not does_intersect(ls_inside, circle)

    ls_outside = LineSegment(P2(0, 175), P2(175, 0))
    assert not does_intersect(circle, ls_outside)
    assert not does_intersect(ls_outside, circle)
예제 #27
0
def test_does_intersect_line_line_segment():
    line = Line(1, 0, 0)
    x_ls = LineSegment(P2(-1, 0), P2(1, 0))
    p_ls = LineSegment(P2(-1, -1), P2(-1, 1))

    assert does_intersect(line, x_ls)
    assert does_intersect(x_ls, line)

    assert not does_intersect(line, p_ls)
    assert not does_intersect(p_ls, line)

    with pytest.raises(ValueError):
        does_intersect(line, LineSegment(P2(0, 0), P2(0, 1)))
예제 #28
0
def test_does_intersect_polygon_line_segment(cw_polygon):

    ls_inside = LineSegment(P2(0.25, 0.25), P2(0.75, 0.75))

    assert not does_intersect(cw_polygon, ls_inside)
    assert not does_intersect(ls_inside, cw_polygon)

    ls_x = LineSegment(P2(0.5, 0.5), P2(1, 1))
    assert does_intersect(cw_polygon, ls_x)
    assert does_intersect(ls_x, cw_polygon)

    ls_outside = LineSegment(P2(-1, -1), P2(-1, 1))
    assert not does_intersect(cw_polygon, ls_outside)
    assert not does_intersect(ls_outside, cw_polygon)
예제 #29
0
def test_does_intersect_line_circle():
    circle = Circle(99, P2(100, 100))

    assert not does_intersect(circle, Line(1, 1, 0))
    assert not does_intersect(Line(1, 1, 0), circle)

    assert does_intersect(circle, Line(1, -1, 0))
    assert does_intersect(Line(1, -1, 0), circle)

    assert does_intersect(circle, Line(1, 0, 100))
    assert does_intersect(Line(1, 0, 100), circle)

    assert does_intersect(circle, Line(0, 1, 100))
    assert does_intersect(Line(0, 1, 100), circle)

    assert not does_intersect(circle, Line(1, 0, 0))
    assert not does_intersect(Line(1, 0, 0), circle)

    assert does_intersect(circle, Line(1, 0, 1))
    assert does_intersect(Line(1, 0, 1), circle)
예제 #30
0
def test_approx():

    assert approx(P2(0, 0), P2(0.0, 0.0))
    assert approx(P2(0.0000001, 0.0000001), P2(0, 0))
    assert not approx(P2(0, 0), V2(0, 0))