def save(cls, image, filename, mosaic=False): # Use debug=False everywhere to turn off SVG validation, # which turns out to be obscenely expensive in this # library. DEBUG = False svg = svgwrite.Drawing(filename=filename, style='background-color: black;', size=(("%dpx" % (2 * image.r_outer), "%dpx" % (2 * image.r_outer))), debug=DEBUG) group = Group(debug=DEBUG) group.translate(image.r_outer, image.r_outer) for y, row in enumerate(image.pixels): ring = image.rings[y] theta = 2 * math.pi / len(row) r1 = ring.center + image.r_ring / 2 r2 = ring.center - image.r_ring / 2 for x, c in enumerate(row): if mosaic: path = Path(stroke='black', stroke_width=1, fill=cls.color_hex(c), debug=DEBUG) path.push((('M', 0, r2), ('L', 0, r1), ('A', r1, r1, 0, '0,0', (r1 * sin(theta), r1 * cos(theta))), ('L', r2 * sin(theta), r2 * cos(theta)), ('A', r2, r2, 0, '0,1', (0, r2)))) else: path = Path(stroke=cls.color_hex(c), stroke_width=image.r_pixel, fill='none', debug=DEBUG) path.push((('M', 0, ring.center), ('A', ring.center, ring.center, 0, '0,0', (ring.center * sin(theta), ring.center * cos(theta))))) path.rotate(180 - degrees(theta * (x + 1)), center=(0, 0)) group.add(path) svg.add(group) svg.save()
def save(cls, image, filename, mosaic=False): # Use debug=False everywhere to turn off SVG validation, # which turns out to be obscenely expensive in this # library. DEBUG = False svg = svgwrite.Drawing(filename=filename, style='background-color: black;', size=(("%dpx" % (2 * image.r_outer), "%dpx" % (2 * image.r_outer))), debug=DEBUG) group = Group(debug=DEBUG) group.translate(image.r_outer, image.r_outer) for y, row in enumerate(image.pixels): ring = image.rings[y] theta = 2 * math.pi / len(row) r1 = ring.center + image.r_ring / 2 r2 = ring.center - image.r_ring / 2 for x, c in enumerate(row): if mosaic: path = Path(stroke='black', stroke_width=1, fill=cls.color_hex(c), debug=DEBUG) path.push( (('M', 0, r2), ('L', 0, r1), ('A', r1, r1, 0, '0,0', (r1 * sin(theta), r1 * cos(theta))), ('L', r2 * sin(theta), r2 * cos(theta)), ('A', r2, r2, 0, '0,1', (0, r2)))) else: path = Path(stroke=cls.color_hex(c), stroke_width=image.r_pixel, fill='none', debug=DEBUG) path.push((('M', 0, ring.center), ('A', ring.center, ring.center, 0, '0,0', (ring.center * sin(theta), ring.center * cos(theta))))) path.rotate(180 - degrees(theta * (x + 1)), center=(0, 0)) group.add(path) svg.add(group) svg.save()
def draw_slice(center, radius, start_angle, stop_angle, **kwargs): p_a = Path(**kwargs) angle = math.radians(stop_angle - start_angle) / 2.0 p_a.push(f"""M {center[0]} {center[1]} l {cos(-1*angle)*radius} {sin(-1*angle)*radius}""") p_a.push_arc( target=(cos(angle) * radius + center[0], sin(angle) * radius + center[1]), rotation=0, r=radius, large_arc=True if stop_angle - start_angle > 180 else False, angle_dir="+", absolute=True, ) p_a.push("Z") p_a.rotate( angle=(min([start_angle, stop_angle]) + (stop_angle - start_angle) / 2.0), center=center, ) return p_a