slice_angle = 90 c = math.floor(sphere_radius) center = (c + 0.5, c + 0.5) def slice_radius(sphere_radius, z): return math.sqrt(max(sphere_radius**2 - z**2, 0)) for z in range(-half_num_steps, half_num_steps + 1): print('z', z) mu = z / (max_z - min_z) r1 = slice_radius(sphere_radius, z) points = circle(center, r1) r2 = slice_radius(inner_sphere_radius, z) points -= circle(center, r2) start_angle = interpolate(min_angle, max_angle, mu) end_angle = start_angle + slice_angle slice_1 = radial_slice(points, center, start_angle, end_angle) start_angle = start_angle + 180 end_angle = start_angle + slice_angle slice_2 = radial_slice(points, center, start_angle, end_angle) points = slice_1 | slice_2 print('-'*c*2) print(format_points(points, max_x=c*2, max_y=c*2, off='.'))
min_radius = 16.5 max_radius = 0 min_angle = -360 * 2.0 max_angle = 0 num_steps = 60 c = math.floor(max(min_radius, max_radius)) center = (c, c) layers = [] for step in range(num_steps + 1): mu = step / num_steps outer = interpolate(min_radius, max_radius, mu) if outer <= 0: break inner = outer - ring_width start_angle = interpolate(min_angle, max_angle, mu) slice_angle = (slice_width / (outer * 2 * math.pi)) * 360 end_angle = start_angle + slice_angle points = ring(center, outer, inner) points = radial_slice(points, center, start_angle, end_angle) layers.append(points)
import math import vec from shape_template import interpolate, polygon, format_points radius = 5 * math.sqrt(2) start_angle = 45 end_angle = 90 + 45 c = math.floor(radius) center = (c, c) num_steps = 20 def regular_polygon(radius, num_sides, start_angle): for i in range(num_sides): angle = start_angle - (i * 360) / num_sides point = (0, radius) yield vec.rotate(point, math.radians(angle)) for i in range(num_steps + 1): print(i) mu = i / num_steps angle = interpolate(start_angle, end_angle, mu) vertices = list(regular_polygon(radius, 4, angle)) vertices = [vec.add(center, v) for v in vertices] points = polygon(vertices) print('-'*c*2) print(format_points(points, max_x=c*2, max_y=c*2, off='.'))