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)
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
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), }
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
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()
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
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()
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)
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()
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)))
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)})
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)
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)
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)
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))
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))
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()
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)
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)
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)))
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)
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)
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))