diff --git a/examples/stereographic_hex_maze.scad b/examples/stereographic_hex_maze.scad index c15e4679..4deb38fe 100644 --- a/examples/stereographic_hex_maze.scad +++ b/examples/stereographic_hex_maze.scad @@ -12,7 +12,14 @@ wall_height = 1; // build a hex maze module build_hex_maze(y_cells, x_cells, maze_vector, cell_radius, wall_thickness) { - module hex_seg(begin, end) { + function cell_position(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]; + + module hex_seg(begin, end) { polyline2d( [for(a = [begin:60:end]) [cell_radius * cos(a), cell_radius * sin(a)]], @@ -28,66 +35,64 @@ module build_hex_maze(y_cells, x_cells, maze_vector, cell_radius, wall_thickness module down_wall() { hex_seg(240, 300); } module down_right_wall() { hex_seg(300, 360); } - function cell_position(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]; - - module build_cell_right_wall(x_cell) { - up_right_wall(); - if(x_cell % 2 != 0) { - down_right_wall(); - } - } - - module build_cell_row_wall(x_cell) { - if(x_cell % 2 != 0) { + module build_cell(x, y, wall_type) { + module build_right_wall(x_cell) { up_right_wall(); - } - else { - down_right_wall(); - } - } - - module build_cell_border_if_necessary(x_cell, y_cell) { - if(x_cell == 0) { - up_left_wall(); - down_left_wall(); - } - - if(y_cell == 0) { - down_wall(); - if(x_cell % 2 == 0) { - down_left_wall(); + if(x_cell % 2 != 0) { down_right_wall(); } - } - else if(y_cell == y_cells - 1 && x_cell % 2 != 0) { - up_left_wall(); } + + module build_row_wall(x_cell, y_cell) { + if(x_cell % 2 != 0) { + up_right_wall(); + if(y_cell == y_cells - 1) { + up_left_wall(); + } + } + else { + down_right_wall(); + } + } + + build_row_wall(x, y); + + if(wall_type == UPPER_WALL || wall_type == UPPER_RIGHT_WALL) { + upper_wall(); + } + if(wall_type == RIGHT_WALL || wall_type == UPPER_RIGHT_WALL) { + build_right_wall(x); + } } // create the wall of maze - for(i = [0:len(maze_vector) - 1]) { - cord = maze_vector[i]; - x = cord[0] - 1; - y = cord[1] - 1; - wall_type = cord[2]; - + for(cell = maze_vector) { + x = cell[0] - 1; + y = cell[1] - 1; + wall_type = cell[2]; translate(cell_position(x, y)) { - if(wall_type == UPPER_WALL || wall_type == UPPER_RIGHT_WALL) { - upper_wall(); - } - if(wall_type == RIGHT_WALL || wall_type == UPPER_RIGHT_WALL) { - build_cell_right_wall(x); - } - - build_cell_row_wall(x); - build_cell_border_if_necessary(x, y); + build_cell(x, y, wall_type); } } + + // build left border + for(y = [0:y_cells - 1]) { + translate(cell_position(0, y)) { + up_left_wall(); + down_left_wall(); + } + } + + // build bottom border + for(x = [0:x_cells - 1]) { + translate(cell_position(x, 0)) { + down_wall(); + if(x % 2 == 0) { + down_left_wall(); + down_right_wall(); + } + } + } } module hex_maze_stereographic_projection(x_cells, cell_radius, wall_thickness, fn, wall_height, shadow) {