def test_square_by_radius(): corners = list(ngon(4, radius=1)) assert len(corners) == 4 assert is_close_points(corners[0], (1, 0, 0)) assert is_close_points(corners[1], (0, 1, 0)) assert is_close_points(corners[2], (-1, 0, 0)) assert is_close_points(corners[3], (0, -1, 0))
def test_spline_interpolation(): vertices = [(0., 0.), (1., 2.), (3., 1.), (5., 3.)] result = spline_interpolation(vertices, method='uniform', subdivide=4) assert len(result) == 13 # (len-1) * subdivide + 1 assert is_close_points((0, 0, 0), result[0]), 'expected start point' assert is_close_points((5, 3, 0), result[-1]), 'expected end point' assert is_close_points((1, 2, 0), result[4]), 'expected 2. fit point' assert is_close_points((3, 1, 0), result[8]), 'expected 3. fit point'
def check_intersection(m, p1, p2, abs_tol=1e-4): p1 = Vec2(p1) p2 = Vec2(p2) circle2 = ConstructionCircle(m, 1.5) points = circle1.intersect_circle(circle2, abs_tol=abs_tol) self.assertEqual(len(points), 2) a, b = points result1 = is_close_points(a, p1, abs_tol=abs_tol) and is_close_points(b, p2, abs_tol=abs_tol) result2 = is_close_points(a, p2, abs_tol=abs_tol) and is_close_points(b, p1, abs_tol=abs_tol) return result1 or result2
def close_polygon(vertices: Iterable['Vertex']) -> List['Vertex']: """ Returns list of vertices, where vertices[0] == vertices[-1]. """ vertices = list(vertices) if not is_close_points(vertices[0], vertices[-1]): vertices.append(vertices[0]) return vertices
def test_as_bspline(): spiral = EulerSpiral(2.0) spline = spiral.bspline(5, 10) assert spline.degree == 3 assert spline.max_t == 5 results = spline.approximate(10) for expected, result in zip(expected_points, results): assert is_close_points(Vector(expected), result)
def test_heptagon_by_edge_length(): corners = list(ngon(7, length=10)) assert len(corners) == 7 assert is_close_points(corners[0], (11.523824354812433, 0, 0)) assert is_close_points(corners[1], (7.184986963636852, 9.009688679024192, 0)) assert is_close_points(corners[2], (-2.564292158181384, 11.234898018587335, 0)) assert is_close_points(corners[3], (-10.382606982861683, 5, 0)) assert is_close_points(corners[4], (-10.382606982861683, -5, 0)) assert is_close_points(corners[5], (-2.564292158181387, -11.234898018587335, 0)) assert is_close_points(corners[6], (7.18498696363685, -9.009688679024192, 0))
def test_rotate(): p = [(1, 0, 3), (0, 1, 6)] r = list(rotate(p, 90, deg=True)) assert is_close_points(r[0], (0, 1, 3)) assert is_close_points(r[1], (-1, 0, 6))
def test_scale(): p = [(1, 2, 3), (4, 5, 6)] r = list(scale(p, (3, 2, 1))) assert is_close_points(r[0], (3, 4, 3)) assert is_close_points(r[1], (12, 10, 6))
def test_translate(): p = [(1, 2, 3), (4, 5, 6)] r = list(translate(p, (3, 2, 1))) assert is_close_points(r[0], (4, 4, 4)) assert is_close_points(r[1], (7, 7, 7))
def test_circle_midpoint(): spiral = EulerSpiral(2.0) m = spiral.circle_midpoint(2.0) assert is_close_points(m, (0.9917242992178723, 2.082593218533209, 0))
def test_approximate(): spiral = EulerSpiral(2.0) results = spiral.approximate(5, 10) for expected, result in zip(expected_points, results): assert is_close_points(Vector(expected), result)
def test_intersect_ray_intersect(): circle = ConstructionCircle((10., 10.), 3) ray_vert = ConstructionRay((8.5, 10.), angle=HALF_PI) cross_points = circle.intersect_ray(ray_vert) assert len(cross_points) == 2 p1, p2 = cross_points if p1[1] > p2[1]: p1, p2 = p2, p1 assert is_close_points(p1, (8.5, 7.4019), abs_tol=1e-4) is True assert is_close_points(p2, (8.5, 12.5981), abs_tol=1e-4) is True ray_hor = ConstructionRay((10, 8.5), angle=0.) cross_points = circle.intersect_ray(ray_hor) assert len(cross_points) == 2 p1, p2 = cross_points if p1[0] > p2[0]: p1, p2 = p2, p1 assert is_close_points(p1, (7.4019, 8.5), abs_tol=1e-4) is True assert is_close_points(p2, (12.5981, 8.5), abs_tol=1e-4) is True ray_slope = ConstructionRay((5, 5), (16, 12)) cross_points = circle.intersect_ray(ray_slope) assert len(cross_points) == 2 p1, p2 = cross_points if p1[0] > p2[0]: p1, p2 = p2, p1 assert is_close_points(p1, (8.64840, 7.3217), abs_tol=1e-4) is True assert is_close_points(p2, (12.9986, 10.0900), abs_tol=1e-4) is True # ray with slope through midpoint ray_slope = ConstructionRay((10, 10), angle=HALF_PI / 2) cross_points = circle.intersect_ray(ray_slope) assert len(cross_points) == 2 p1, p2 = cross_points if p1[0] > p2[0]: p1, p2 = p2, p1 # print (p1[0], p1[1], p2[0], p2[1]) assert is_close_points(p1, (7.8787, 7.8787), abs_tol=1e-4) is True assert is_close_points(p2, (12.1213, 12.1213), abs_tol=1e-4) is True # horizontal ray through midpoint ray_hor = ConstructionRay((10, 10), angle=0) cross_points = circle.intersect_ray(ray_hor) assert len(cross_points) == 2 p1, p2 = cross_points if p1[0] > p2[0]: p1, p2 = p2, p1 # print (p1[0], p1[1], p2[0], p2[1]) assert is_close_points(p1, (7, 10), abs_tol=1e-5) is True assert is_close_points(p2, (13, 10), abs_tol=1e-5) is True # vertical ray through midpoint ray_vert = ConstructionRay((10, 10), angle=HALF_PI) cross_points = circle.intersect_ray(ray_vert) assert len(cross_points) == 2 p1, p2 = cross_points if p1[1] > p2[1]: p1, p2 = p2, p1 # print (p1[0], p1[1], p2[0], p2[1]) assert is_close_points(p1, (10, 7), abs_tol=1e-5) is True assert is_close_points(p2, (10, 13), abs_tol=1e-5) is True
def check_touch(m, t, abs_tol=1e-9): circle2 = ConstructionCircle(m, 1.5) points = circle1.intersect_circle(circle2, 4) assert len(points) == 1 return is_close_points(points[0], Vec2(t), abs_tol=abs_tol)