/ src / hexagons.scad
hexagons.scad
 1  /**
 2  * hexagons.scad
 3  *
 4  * @copyright Justin Lin, 2017
 5  * @license https://opensource.org/licenses/lgpl-3.0.html
 6  *
 7  * @see https://openhome.cc/eGossip/OpenSCAD/lib3x-hexagons.html
 8  *
 9  **/ 
10  
11  module hexagons(radius, spacing, levels) {
12      beginning_n = 2 * levels - 1; 
13      offset_x = radius * cos(30);
14      offset_y = radius + radius * sin(30);
15      r_hexagon = radius - spacing / 2;
16      offset_step = 2 * offset_x;
17      center_offset = 2 * (offset_x - offset_x * levels);
18  
19      module hexagon() {
20          rotate(30) 
21              circle(r_hexagon, $fn = 6);     
22      }
23  
24      function hexagons_pts(hex_datum) =
25          let(
26              tx = hex_datum[0][0],
27              ty = hex_datum[0][1],
28              n = hex_datum[1],
29              offset_xs = [for(i = 0; i < n; i = i + 1) i * offset_step + center_offset] 
30          )
31          [
32              for(x = offset_xs) [x + tx, ty]
33          ];
34  
35      module line_hexagons(hex_datum) {
36          tx = hex_datum[0][0];
37          ty = hex_datum[0][1];
38          n = hex_datum[1]; 
39  
40          offset_xs = [for(i = 0; i < n; i = i + 1) i * offset_step + center_offset];
41          for(x = offset_xs) {
42              translate([x + tx, ty, 0]) 
43                  hexagon();
44          }
45      }
46      
47      upper_hex_data = levels > 1 ? [
48          for(i = [1:beginning_n - levels])
49              let(
50                  x = offset_x * i,
51                  y = offset_y * i,
52                  n = beginning_n - i
53              ) [[x, y], n]
54      ] : [];
55  
56      lower_hex_data = levels > 1 ? [
57          for(hex_datum = upper_hex_data)
58          [[hex_datum[0][0], -hex_datum[0][1]], hex_datum[1]]
59      ] : [];
60  
61      total_hex_data = [[[0, 0], beginning_n], each upper_hex_data, each lower_hex_data];
62  
63      pts_all_lines = [
64          for(hex_datum = total_hex_data)
65              hexagons_pts(hex_datum)
66      ];
67  
68      for(pts_one_line = pts_all_lines, pt = pts_one_line) {
69          translate(pt) 
70              hexagon();
71      }
72  
73      test_each_hexagon(r_hexagon, pts_all_lines);
74  }
75   
76  // override it to test
77  module test_each_hexagon(hex_r, pts_all_lines) {
78  
79  }