mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-20 13:31:30 +02:00
add mz_hex_walls
This commit is contained in:
49
src/maze/_impl/_mz_hex_walls.scad
Normal file
49
src/maze/_impl/_mz_hex_walls.scad
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
use <maze/mz_get.scad>;
|
||||||
|
|
||||||
|
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]
|
||||||
|
];
|
53
src/maze/mz_hex_walls.scad
Normal file
53
src/maze/mz_hex_walls.scad
Normal file
@@ -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);
|
Reference in New Issue
Block a user