/ examples / emotion_ball.scad
emotion_ball.scad
  1  use <arc.scad>
  2  use <pie.scad>
  3  use <polyline2d.scad>
  4  
  5  ball_radius = 15;
  6  thickness = 2.5;
  7  magnet_radius = 3.2;
  8  magnet_height = 1.5;
  9  
 10  emoticon(ball_radius, magnet_radius, magnet_height, thickness)
 11      grinning_face_with_smiling_eyes(ball_radius);
 12      
 13  translate([ball_radius * 2.5, 0, 0])
 14  emoticon(ball_radius, magnet_radius, magnet_height, thickness)
 15      grinning_squinting_face(ball_radius);
 16      
 17  translate([ball_radius * 5, 0, 0])
 18  emoticon(ball_radius, magnet_radius, magnet_height, thickness)
 19      persevering_face(ball_radius);
 20  
 21  translate([ball_radius * 7.5, 0, 0])    
 22  emoticon(ball_radius, magnet_radius, magnet_height, thickness)
 23      smirking_face(ball_radius);
 24  
 25  module emoticon(ball_radius, magnet_radius, magnet_height, thickness) {
 26      $fn = 64;
 27      difference() {
 28          sphere(ball_radius);
 29          sphere(ball_radius - thickness);
 30          
 31          translate([0, 0, -ball_radius])
 32          linear_extrude(magnet_height)
 33              circle(magnet_radius);
 34          
 35          translate([0, 0, ball_radius])
 36          mirror([0, 0, 1])
 37          linear_extrude(ball_radius * 1.1, scale = 0.5)
 38              children();
 39      }
 40  }
 41  
 42  // design your emoticon in a cirle with a radius of `ball_radius`.
 43  
 44  module grinning_face_with_smiling_eyes(ball_radius) {
 45      translate([ball_radius / 2.25, ball_radius / 8, 0]) 
 46          arc(ball_radius / 4, 180, width = ball_radius / 10);
 47  
 48      translate([-ball_radius / 2.25, ball_radius / 8, 0]) 
 49          arc(ball_radius / 4, 180, width = ball_radius / 10);
 50  
 51      scale([1, 0.8, 1])
 52      translate([0, -ball_radius / 3, 0]) 
 53          pie(radius = ball_radius / 1.5, angle = [180, 360]);   
 54  }
 55  
 56  module grinning_squinting_face(ball_radius) {
 57      r = ball_radius * 0.4;
 58      a = 25;
 59      
 60      translate([ball_radius / 4, ball_radius / 4, 0]) 
 61          polyline2d([[r * cos(a), r * sin(a)], [0, 0], [r * cos(a), r * -sin(a)]], width = ball_radius / 10);
 62  
 63      translate([-ball_radius / 4, ball_radius / 4, 0]) 
 64          polyline2d([[-r * cos(a), r * sin(a)], [0, 0], [-r * cos(a), r * -sin(a)]], width = ball_radius / 10);
 65  
 66      scale([1, 0.8, 1])
 67      translate([0, -ball_radius / 3, 0]) 
 68          pie(radius = ball_radius / 1.5, angle = [180, 360]);   
 69  }
 70  
 71  module persevering_face(ball_radius) {
 72      r = ball_radius * 0.4;
 73      a = 25;
 74      
 75      translate([ball_radius / 4, ball_radius / 4, 0]) 
 76          polyline2d([[r * cos(a), r * sin(a)], [0, 0], [r * cos(a), r * -sin(a)]], width = ball_radius / 10);
 77  
 78      translate([-ball_radius / 4, ball_radius / 4, 0]) 
 79          polyline2d([[-r * cos(a), r * sin(a)], [0, 0], [-r * cos(a), r * -sin(a)]], width = ball_radius / 10);
 80  
 81      scale([1.4, 0.8, 1])
 82      translate([0, -ball_radius / 1.75, 0]) 
 83          arc(ball_radius / 4, 180, width = ball_radius / 10);
 84  }
 85  
 86  module smirking_face(ball_radius) {
 87      r = ball_radius * 0.4;
 88      a = 25;
 89      
 90      translate([ball_radius / 2.5, ball_radius / 25, 0]) {
 91          //scale([1, 0.9, 1])
 92          arc(ball_radius / 3, [35, 150], width = ball_radius / 10);
 93          translate([ball_radius / 6, ball_radius / 5.5 ,0])
 94              circle(ball_radius / 8);
 95      }
 96      
 97      translate([-ball_radius / 2, ball_radius / 25, 0]) {
 98          //scale([1, 0.9, 1])
 99          arc(ball_radius / 3, [35, 150], width = ball_radius / 10);
100          translate([ball_radius / 6, ball_radius / 5.5 ,0])
101              circle(ball_radius / 8);
102      }
103  
104      scale([1.3, 1, 1])
105      translate([-ball_radius / 15, -ball_radius / 6, 0]) 
106          arc(ball_radius / 3, [235, 350], width = ball_radius / 10);
107  }
108