diff --git a/examples/maze/maze_vase.scad b/examples/maze/maze_vase.scad new file mode 100644 index 00000000..dca4a19b --- /dev/null +++ b/examples/maze/maze_vase.scad @@ -0,0 +1,87 @@ +use ; +use ; +use ; +use ; +use ; +use ; +use ; + +$fn = 36; +t_step = 0.04; +radius = 50; +thickness = 1.5; +wall_detail = 0; + +maze_vase(); + +module maze_vase() { + p0 = [radius * 0.75, 0, 0]; + p1 = [radius * 2, 0, radius * 1.2]; + p2 = [0, 0, radius * 1.2 * 2]; + p3 = [radius, 0, radius * 1.2 * 3]; + + points = bezier_curve(t_step, [p0, p1, p2, p3]); + + rows = len(points) - 2; + columns = $fn; + + angles = [ + for(i = [0:rows]) + angle_between([points[i].x + radius * 10, 0, points[i].z] - points[i], points[i + 1] - points[i]) + ]; + + wall_r = thickness * 2; + cells = mz_square(rows, columns, x_wrapping = true); + a_step = 360 / $fn; + + for(row = cells, cell = row) { + x = mz_square_get(cell, "x"); + y = mz_square_get(cell, "y"); + type = mz_square_get(cell, "t"); + + if(type == "TOP_WALL" || type == "TOP_RIGHT_WALL") { + p = points[y + 1]; + a = angles[y + 1]; + + hull() { + rotate(x * a_step) + translate(p) + rotate([0, -a, 0]) + octahedron(wall_r, wall_detail); + + rotate((x + 1) * a_step) + translate(p) + rotate([0, -a, 0]) + octahedron(wall_r, wall_detail); + } + } + + if(type == "RIGHT_WALL" || type == "TOP_RIGHT_WALL") { + p1 = points[y]; + p2 = points[y + 1]; + a1 = angles[y]; + a2 = angles[y + 1]; + + rotate((x + 1) * a_step) + hull() { + translate(p1) + rotate([0, -a1, 0]) + octahedron(wall_r, wall_detail); + + translate(p2) + rotate([0, -a2, 0]) + octahedron(wall_r, wall_detail); + } + } + } + + translate([0, 0, -wall_r]) + linear_extrude(thickness * 2, scale = 1.02) + hull() + polygon(shape_circle(p0.x + thickness * .75)); + + color("black") + rotate_extrude() + polyline_join([for(i = [0:rows]) [points[i].x, points[i].z]]) + circle(thickness, $fn = $fn / 4); +} \ No newline at end of file