diff --git a/examples/turtle/fidget_ball.scad b/examples/turtle/fidget_ball.scad new file mode 100644 index 00000000..b91e7356 --- /dev/null +++ b/examples/turtle/fidget_ball.scad @@ -0,0 +1,85 @@ +$fn = 48; + +radius = 40; +thickness = 2; +layers = 5; +spacing = 2.5; +support_thickness = 1; +drill_angle = 36; + +fidget_ball(radius, thickness, layers, spacing, support_thickness); + +module drill(deep, drill_angle) { + a = drill_angle / 2; + r = deep * tan(a); + + difference() { + children(0); + union() { + for(i = [0:3]) { + rotate([90 * i, 0, 0]) + translate([0, 0, -deep]) + linear_extrude(deep, scale = 0.01) + circle(r); + } + for(i = [90, -90]) { + rotate([0, i, 0]) + translate([0, 0, -deep]) + linear_extrude(deep, scale = 0.01) + circle(r); + } + + for(i = [0:3]) { + rotate([0, 54.7356, 45 + i * 90]) + translate([0, 0, -deep]) + linear_extrude(deep, scale = 0.01) + circle(r); + + rotate([0, -125.2644, 45 + i * 90]) + translate([0, 0, -deep]) + linear_extrude(deep, scale = 0.01) + circle(r); + } + } + } +} + +module hollow_sphere(radius, thickness) { + difference() { + sphere(radius); + sphere(radius - thickness); + } +} + +module support(i, sphere_r, height, support_thickness, drill_angle) { + a = drill_angle / 2; + support_r = 2 * sphere_r * sin(a / 2) ^ 2; + + sina = sin(a); + tana = tan(a); + + translate([0, 0, -sphere_r]) + rotate_extrude() + translate([sphere_r * sina, 0]) + polygon([[0, support_r], [-.75, support_r], [-tana * support_r - support_thickness, 0], [-tana * support_r, 0]]); + + translate([0, 0, -sphere_r - height * i]) + linear_extrude(height * i) + difference() { + circle(sphere_r * sina - tana * support_r); + circle(sphere_r * sina - tana * support_r - support_thickness); + } +} + +module fidget_ball(radius, thickness, layers, spacing, support_thickness) { + r_step = thickness + spacing; + + drill(radius, drill_angle) + for(i = [0:layers - 1]) { + hollow_sphere(radius - r_step * i, thickness); + } + + for(i = [0:layers - 1]) { + support(i, radius - r_step * i, r_step, support_thickness, drill_angle); + } +} \ No newline at end of file