1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 14:18:13 +01:00

add L_puzzle

This commit is contained in:
Justin Lin 2020-09-11 08:07:33 +08:00
parent ef60607f37
commit 840da32336

100
examples/L_puzzle.scad Normal file
View File

@ -0,0 +1,100 @@
use <util/fibseq.scad>;
model = "ALL"; // [ALL, PIECE1, PIECE2]
level = 10;
thickness = 1;
thickness_step = true;
p = 1.272;
spacing = 0;
// n: 1 or 2
module L_piece(n, thickness, p = 1.272, spacing = 0) {
sides = [for(i = [0:5]) pow(p, n + i) - spacing];
linear_extrude(thickness)
polygon([
[0, 0],
[sides[5], 0],
[sides[5], sides[2]],
[sides[3], sides[2]],
[sides[3], sides[4]],
[0, sides[4]],
]);
}
module L_puzzle(level, thickness, thickness_step = true, p = 1.272) {
s4 = pow(p, 4);
s5 = pow(p, 5);
s6 = pow(p, 6);
s7 = pow(p, 7);
module p1() {
color(rands(0, 1, 3))
L_piece(2, thickness);
}
module p2() {
offset1 = s7;
offset2 = s4 + s6;
translate([0, offset1])
rotate(-90) {
p1();
translate([offset1, offset2])
mirror([1, 0, 0])
rotate(-90)
color(rands(0, 1, 3))
L_piece(1, thickness_step ? thickness * 2 : thickness);
}
}
fibs = fibseq(1, round(level / 2) + 1);
module _L_puzzle(level) {
if(level == 1) {
p1();
}
else if(level == 2) {
p2();
}
else {
nth = round(level / 2 - 1);
is_even = level % 2 == 0;
offset1 = is_even ?
s5 * fibs[nth - 1] + s7 * fibs[nth] :
s4 * fibs[nth - 1] + s6 * fibs[nth];
offset2 = is_even ?
s4 * fibs[nth] + s6 * fibs[nth + 1] :
s5 * fibs[nth - 1] + s7 * fibs[nth];
translate([0, offset1])
rotate(-90) {
scale([1, 1, thickness_step ? 1 + level * 0.05 : 1])
_L_puzzle(level - 1);
translate([offset1, offset2])
mirror([1, 0, 0])
rotate(-90)
scale([1, 1, thickness_step ? 1 + (level - 1) * 0.05 : 1])
_L_puzzle(level - 2);
}
}
}
_L_puzzle(level);
}
if(model == "ALL") {
L_puzzle(level, thickness, thickness_step, p);
}
else if(model == "PIECE1") {
L_piece(1, thickness, p, spacing);
}
else if(model == "PIECE2") {
L_piece(2, thickness, p, spacing);
}