From 23c86b1ec2e1fb2ffacb6b535f4bf7b0163767f9 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 3 Oct 2020 21:16:13 +0800 Subject: [PATCH] add mz_hex_walls --- src/maze/_impl/_mz_hex_walls.scad | 49 ++++++++++++++++++++++++++++ src/maze/mz_hex_walls.scad | 53 +++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/maze/_impl/_mz_hex_walls.scad create mode 100644 src/maze/mz_hex_walls.scad diff --git a/src/maze/_impl/_mz_hex_walls.scad b/src/maze/_impl/_mz_hex_walls.scad new file mode 100644 index 00000000..d2b0332c --- /dev/null +++ b/src/maze/_impl/_mz_hex_walls.scad @@ -0,0 +1,49 @@ +use ; + +function _get_x(block) = mz_get(block, "x"); +function _get_y(block) = mz_get(block, "y"); +function _get_wall_type(block) = mz_get(block, "w"); + +function _is_upper_wall(block) = _get_wall_type(block) == "UPPER_WALL"; +function _is_right_wall(block) = _get_wall_type(block) == "RIGHT_WALL"; +function _is_upper_right_wall(block) = _get_wall_type(block) == "UPPER_RIGHT_WALL"; + +function _cell_position(cell_radius, x_cell, y_cell) = + let( + grid_h = 2 * cell_radius * sin(60), + grid_w = cell_radius + cell_radius * cos(60) + ) + [grid_w * x_cell, grid_h * y_cell + (x_cell % 2 == 0 ? 0 : grid_h / 2), 0]; + +function _hex_seg(cell_radius, begin, end) = [for(a = [begin:60:end]) + [cell_radius * cos(a), cell_radius * sin(a)]]; + +function _upper_right(cell_radius) = _hex_seg(cell_radius, 0, 60); +function _upper(cell_radius) = _hex_seg(cell_radius, 60, 120); +function _upper_left(cell_radius) = _hex_seg(cell_radius, 120, 180); +function _down_left(cell_radius) = _hex_seg(cell_radius, 180, 240); +function _down(cell_radius) = _hex_seg(cell_radius, 240, 300); +function _down_right(cell_radius) = _hex_seg(cell_radius, 300, 360); + +function _right_wall(cell_radius, x_cell) = + (x_cell % 2 != 0) ? _down_right(cell_radius) : _upper_right(cell_radius); + +function _row_wall(cell_radius, x_cell, y_cell) = + x_cell % 2 != 0 ? [_upper_right(cell_radius), _upper_left(cell_radius)] : [_down_right(cell_radius)]; + +function _build_cell(cell_radius, block) = + let( + x = _get_x(block) - 1, + y = _get_y(block) - 1, + walls = concat( + _row_wall(cell_radius, x, y), + [_is_upper_wall(block) || _is_upper_right_wall(block) ? _upper(cell_radius) : []], + [_is_right_wall(block) || _is_upper_right_wall(block) ? _right_wall(cell_radius, x) : []] + ) + ) + [ + for(wall = walls) + if(wall != []) + [for(p = wall) + _cell_position(cell_radius, x, y) + p] + ]; diff --git a/src/maze/mz_hex_walls.scad b/src/maze/mz_hex_walls.scad new file mode 100644 index 00000000..b555feab --- /dev/null +++ b/src/maze/mz_hex_walls.scad @@ -0,0 +1,53 @@ +use <_impl/_mz_hex_walls.scad>; + +function mz_hex_walls(blocks, rows, columns, cell_radius, wall_thickness, left_border = true, bottom_border = true) = + let( + walls = [ + for(block = blocks) + for(wall = _build_cell(cell_radius, block)) + wall + ], + left_pair_walls = left_border ? [ + for(y = [0:rows - 1]) + let( + cell_p = _cell_position(cell_radius, 0, y), + walls1 = _upper_left(cell_radius), + walls2 = _down_left(cell_radius) + ) + [ + [walls1[0] + cell_p, walls1[1] + cell_p], + [walls2[0] + cell_p, walls2[1] + cell_p] + ] + ] : [], + left_border_walls = [ + for(pair = left_pair_walls) + for(wall = pair) + wall + ], + bottom_pair_walls = bottom_border ? [ + for(x = [0:columns - 1]) + let( + cell_p = _cell_position(cell_radius, x, 0), + walls1 = _down(cell_radius), + walls2 = [ + for(pair = (x % 2 == 0 ? [_down_left(cell_radius), _down_right(cell_radius)] : [])) + for(wall = pair) + wall + ] + ) + walls2 == [] ? + [ + [walls1[0] + cell_p, walls1[1] + cell_p] + ] : + [ + [walls1[0] + cell_p, walls1[1] + cell_p], + [walls2[0] + cell_p, walls2[1] + cell_p] + ] + ] : [], + bottom_border_walls = [ + for(pair = bottom_pair_walls) + for(wall = pair) + wall + ] + ) + concat(walls, left_border_walls, bottom_border_walls); \ No newline at end of file