fidget_ball_fern_leaf.scad
1 use <polyline_join.scad> 2 use <hollow_out.scad> 3 use <util/dedup.scad> 4 use <turtle/lsystem2.scad> 5 use <experimental/ptf_c2sphere.scad> 6 7 $fn = 48; 8 9 radius = 36; 10 thickness = 2; 11 spacing = 3; 12 drill_angle = 38; 13 support_thickness = 1; 14 15 engraved = false; // [true, false], warning: previewing is very slow when it's true. 16 17 fidget_ball_fern_leaf(radius, thickness, spacing, drill_angle, support_thickness); 18 19 module fidget_ball_fern_leaf(radius, thickness, spacing, drill_angle, support_thickness) { 20 module fern_ball(radius, thickness, fern_n, thickness_scale) { 21 function fern(n = 8, angle = 4, leng = 1, heading = 0, start = [0, 0]) = 22 let( 23 axiom = "EEEA", 24 rules = [ 25 ["A", "[++++++++++++++EC]B+B[--------------ED]B+BA"], 26 ["C", "[---------EE][+++++++++EE]B+C"], 27 ["D", "[---------EE][+++++++++EE]B-D"] 28 ] 29 ) 30 lsystem2(axiom, rules, n, angle, leng, heading, start, forward_chars = "ABCDE"); 31 32 r = radius * sin(drill_angle / 2) / 2; 33 fern = [ 34 for(line = dedup(fern(n = fern_n))) 35 [ 36 ptf_c2sphere(line[0] + [r, 0], radius * 0.99), 37 ptf_c2sphere(line[1] + [r, 0], radius * 0.99) 38 ] 39 ]; 40 41 module ferns(n) { 42 a_step = 360 / n; 43 for(i = [0:n - 1]) { 44 rotate(i * a_step) 45 for(line = fern) { 46 polyline_join(line) 47 sphere(thickness * thickness_scale / 2, $fn = 5); 48 } 49 } 50 } 51 52 module fern_ball() { 53 ferns(4); 54 55 mirror([1, 0, 0]) 56 mirror([0, 0, 1]) 57 ferns(4); 58 59 mirror([0, 1, 1]) 60 ferns(2); 61 62 mirror([0, 1, 0]) 63 mirror([0, 1, 1]) 64 ferns(2); 65 } 66 67 if(engraved) { 68 difference() { 69 render() 70 difference() { 71 sphere(radius); 72 sphere(radius - thickness); 73 } 74 75 fern_ball(); 76 } 77 } 78 else { 79 color("black") 80 difference() { 81 sphere(radius); 82 sphere(radius - thickness); 83 } 84 85 fern_ball(); 86 } 87 } 88 89 r_step = thickness + spacing; 90 radiuses = [radius, radius - r_step, radius - r_step * 2]; 91 92 fidget_ball_drill_support(radius, thickness, spacing, support_thickness) { 93 fern_ball(radiuses[0], thickness, fern_n = 5, thickness_scale = 0.75); 94 mirror([0, 1, 1]) fern_ball(radiuses[1], thickness, fern_n = 4, thickness_scale = 0.65); 95 mirror([1, 1, 0]) fern_ball(radiuses[2], thickness, fern_n = 3, thickness_scale = 0.55); 96 }; 97 } 98 99 module fidget_ball_drill_support(radius, thickness, spacing, support_thickness) { 100 module drill(deep, drill_angle) { 101 a = drill_angle / 2; 102 r = deep * tan(a); 103 104 difference() { 105 children(0); 106 union() { 107 for(i = [0:3]) { 108 rotate([90 * i, 0, 0]) 109 translate([0, 0, -deep]) 110 linear_extrude(deep, scale = 0.01) 111 circle(r); 112 } 113 for(i = [90, -90]) { 114 rotate([0, i, 0]) 115 translate([0, 0, -deep]) 116 linear_extrude(deep, scale = 0.01) 117 circle(r); 118 } 119 120 for(i = [0:3]) { 121 rotate([0, 54.7356, 45 + i * 90]) 122 translate([0, 0, -deep]) 123 linear_extrude(deep, scale = 0.01) 124 circle(r); 125 126 rotate([0, -125.2644, 45 + i * 90]) 127 translate([0, 0, -deep]) 128 linear_extrude(deep, scale = 0.01) 129 circle(r); 130 } 131 } 132 } 133 } 134 135 module support(i, sphere_r, height, support_thickness, drill_angle) { 136 a = drill_angle / 2; 137 support_r = 2 * sphere_r * sin(a / 2) ^ 2; 138 139 sina = sin(a); 140 tana = tan(a); 141 142 translate([0, 0, -sphere_r]) 143 rotate_extrude() 144 translate([sphere_r * sina, 0]) 145 polygon([[0, support_r], [-.75, support_r], [-tana * support_r - support_thickness, 0], [-tana * support_r, 0]]); 146 147 translate([0, 0, -sphere_r - height * i]) 148 linear_extrude(height * i) 149 hollow_out(support_thickness) 150 circle(sphere_r * sina - tana * support_r); 151 152 } 153 154 r_step = thickness + spacing; 155 156 drill(radius, drill_angle) 157 for(i = [0:$children - 1]) { 158 children(i); 159 } 160 161 for(i = [0:$children - 1]) { 162 support(i, radius - r_step * i, r_step, support_thickness, drill_angle); 163 } 164 }