b = 0.03 c = 0.2 d = 1.5 e = 0.5 wobble = a * math.exp(-b * n) * math.sin(c * n + d * n**e) return ( Angle(-24 + wobble), Angle(24 + wobble), ) center_heading = Heading(90) center = p.position p.turn_to(center_heading) num_layers = 26 for layer in range(num_layers): lo, hi = f(layer) lo = center_heading + lo hi = center_heading + hi p.arc_right((p.heading - lo) + 90, center=center) p.arc_left(180, 1) p.arc_left((hi - p.heading) + 90, center=center) if layer < (num_layers - 1): p.arc_right(180, 1) print(p.paper.format_svg(resolution=720 / p.paper.bounds().width))
def test_arc_segment_bounds(): # Arc which occupies its entire circle. p = Pen() p.fill_mode() p.move_to((1, 0)) p.turn_to(90) p.arc_left(359, 1) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(-1, -1, 1, 1) ) # Arc which pushes the boundary only with the endpoints. p = Pen() p.fill_mode() p.move_to((0, 0)) p.turn_to(30) p.move_forward(1) p.turn_left(90) p.arc_left(30, center=(0, 0)) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(0.5, 0.5, sqrt3 / 2, sqrt3 / 2) ) # Arc which pushes the boundary with the middle in one spot. p = Pen() p.fill_mode() p.move_to((0, 0)) p.turn_to(-45) p.move_forward(1) p.turn_left(90) p.arc_left(90, center=(0, 0)) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(sqrt2 / 2, -sqrt2 / 2, 1, sqrt2 / 2) ) # Arc which goes right. p = Pen() p.fill_mode() p.move_to((0, 0)) p.turn_to(45) p.arc_right(90, 3) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(0, 0, 3 * sqrt2, 3 - 1.5 * sqrt2) ) # Arc which pushes the boundary with the middle in two spots. p = Pen() p.fill_mode() p.move_to((0, 0)) p.turn_to(-45) p.move_forward(1) p.turn_left(90) p.arc_left(180, center=(0, 0)) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(-sqrt2 / 2, -sqrt2 / 2, 1, 1) ) # Half circle, right side p = Pen() p.fill_mode() p.move_to((0, 0)) p.turn_to(0) p.arc_right(180, 5) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(0, -10, 5, 0) ) # Thick circle, p = Pen() p.stroke_mode(1.0) p.move_to((0, 0)) p.turn_to(0) p.move_forward(5) p.turn_left(90) p.arc_left(180, 5, start_slant=45) arc = p.last_segment() assert_equal( arc.bounds(), Bounds(-5.5, -0.5314980314970469, 5.5, 5.5) )
a = 12 b = 0.03 c = 0.2 d = 1.5 e = 0.5 wobble = a * math.exp(-b * n) * math.sin(c * n + d * n**e) return ( Angle(-24 + wobble), Angle(24 + wobble), ) center_heading = Heading(90) center = p.position p.turn_to(center_heading) num_layers = 26 for layer in range(num_layers): lo, hi = f(layer) lo = center_heading + lo hi = center_heading + hi p.arc_right((p.heading - lo) + 90, center=center) p.arc_left(180, 1) p.arc_left((hi - p.heading) + 90, center=center) if layer < (num_layers - 1): p.arc_right(180, 1) print(p.paper.format_svg(resolution=720 / p.paper.bounds().width))