mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-01-16 13:50:05 +01:00
78 lines
2.2 KiB
OpenSCAD
78 lines
2.2 KiB
OpenSCAD
use <hollow_out.scad>
|
|
use <bend_extrude.scad>
|
|
use <box_extrude.scad>
|
|
|
|
x_grids = 12;
|
|
y_grids = 5;
|
|
grid_size = 15;
|
|
final_size = 3;
|
|
line_width = 1;
|
|
fn = 12;
|
|
|
|
module hypnotic_squares(x_grids, y_grids, grid_size, final_size, line_width) {
|
|
function random() = rands(0, 1, 1)[0];
|
|
|
|
dirs = [-1, 0, 1];
|
|
max_steps = ceil((grid_size - final_size) / (line_width * 2));
|
|
start_steps = 2 + round(random() * (max_steps - 2));
|
|
half_lw = line_width / 2;
|
|
|
|
module hollow_square(x, y, size) {
|
|
translate([x - half_lw, y - half_lw])
|
|
hollow_out(line_width)
|
|
square(size + line_width);
|
|
}
|
|
|
|
module draw(x, y, size, xMovement, yMovement, steps) {
|
|
hollow_square(x, y, size);
|
|
|
|
if(steps >= 0) {
|
|
new_size = (grid_size) * (steps / start_steps) + final_size;
|
|
|
|
new_x = x + (size - new_size) / 2;
|
|
new_y = y + (size - new_size) / 2;
|
|
draw(
|
|
new_x - ((x - new_x) / (steps + 3)) * xMovement,
|
|
new_y - ((y - new_y) / (steps + 3)) * yMovement,
|
|
new_size,
|
|
xMovement,
|
|
yMovement,
|
|
steps - 1)
|
|
;
|
|
}
|
|
}
|
|
|
|
rand_lt = [for(x = [0:x_grids - 1])
|
|
[for(y = [0:y_grids - 1]) rands(0, 1, 2)]
|
|
];
|
|
|
|
module grids() {
|
|
translate([0, half_lw])
|
|
for(x = [0:x_grids - 1], y = [0:y_grids - 1]) {
|
|
draw(
|
|
x * grid_size,
|
|
y * grid_size,
|
|
grid_size,
|
|
dirs[floor(rand_lt[x][y][0] * 3)],
|
|
dirs[floor(rand_lt[x][y][1] * 3)],
|
|
start_steps - 1
|
|
);
|
|
}
|
|
}
|
|
|
|
bend_extrude(
|
|
size = [grid_size * x_grids, grid_size * y_grids + line_width],
|
|
thickness = line_width,
|
|
angle = 360,
|
|
frags = $fn
|
|
) grids();
|
|
}
|
|
|
|
|
|
hypnotic_squares(x_grids, y_grids, grid_size, final_size, line_width, $fn = fn);
|
|
|
|
r = (0.5 * grid_size * x_grids / fn) / sin(180 / fn);
|
|
box_extrude(
|
|
height = grid_size * y_grids + line_width,
|
|
shell_thickness = line_width
|
|
) circle(r - line_width / 2, $fn = fn); |