mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-01 12:30:33 +02:00
Hypnotic squares
This commit is contained in:
82
examples/hypnotic_squares.scad
Normal file
82
examples/hypnotic_squares.scad
Normal file
@@ -0,0 +1,82 @@
|
||||
include <hollow_out.scad>;
|
||||
include <bend_extrude.scad>;
|
||||
include <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 < x_grids; x = x + 1)
|
||||
[for(y = 0; y < y_grids; y = y + 1)
|
||||
[random(), random()]
|
||||
]
|
||||
];
|
||||
|
||||
module grids() {
|
||||
translate([0, half_lw])
|
||||
for(x = [0:x_grids - 1]) {
|
||||
for(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);
|
Reference in New Issue
Block a user