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 }