"""" Module related to bezier curve """ def make_cubic_bezier(control_points: [(float, float)], n: int = 10) -> [(float, float)]: """" Interpolate a Bezier-curve by split it into segments of lines (=polyline). A Bezier-Curve is defined by \[ B(P_0, P_1, P_2, P_3:t) = (1-t)^3*P_0 + 3(1-t)^2*t*P_1 + 3(1-t)*t^2*P_2 + t^3*P_3 \] for $t \in \[0, 1\]$ :param control_points :param n number of segments :return a list of points on the Bezier-Curve. """ p0x = control_points[0][0] p0y = control_points[0][1] p1x = control_points[1][0] p1y = control_points[1][1] p2x = control_points[2][0] p2y = control_points[2][1] p3x = control_points[3][0] p3y = control_points[3][1] points = [(p0x, p0y)] for i in range(1, n): t = i / n u = 1 - t x = p0x * u**3 + 3 * p1x * t* u**2 + 3 * p2x * t**2 * u + p3x * t**3 y = p0y * u**3 + 3 * p1y * t* u**2 + 3 * p2y * t**2 * u + p3y * t**3 points.append( (x,y) ) points.append((p3x, p3y)) return points def make_svg_polyline(points) -> str: line = map(lambda p: f"{p[0]},{p[1]}", points) svg = f'' return svg