Загрузить файлы в «/»
This commit is contained in:
140
base.scad
Normal file
140
base.scad
Normal file
@@ -0,0 +1,140 @@
|
||||
base_length = 230;
|
||||
base_width = 110;
|
||||
base_height = 10;
|
||||
|
||||
floor_depth = 2;
|
||||
|
||||
wall_width = 2;
|
||||
glass_down = 5;
|
||||
glass_recess = 2;
|
||||
leg_offset = 2;
|
||||
leg = 5;
|
||||
|
||||
module pit() {
|
||||
translate([0,0,floor_depth]) cube([base_length,
|
||||
base_width,
|
||||
base_height],true);
|
||||
}
|
||||
|
||||
function base_offset() = (leg+leg_offset+glass_recess+wall_width)*2;
|
||||
|
||||
module base_platform() {
|
||||
cube([
|
||||
base_length+base_offset(),
|
||||
base_width+base_offset(),
|
||||
base_height+floor_depth], true);
|
||||
}
|
||||
|
||||
module base() {
|
||||
difference(){
|
||||
base_platform();
|
||||
|
||||
translate([0,0,(base_height+floor_depth)/2-glass_down/2])
|
||||
cube([
|
||||
base_length+(wall_width+glass_recess)*2,
|
||||
base_width+(wall_width+glass_recess)*2,
|
||||
glass_down],true);
|
||||
}
|
||||
|
||||
cube([base_length+(wall_width*2),
|
||||
base_width+(wall_width*2),
|
||||
base_height+floor_depth],true);
|
||||
}
|
||||
|
||||
module carve_cave() {
|
||||
difference() {
|
||||
base();
|
||||
pit();
|
||||
}
|
||||
}
|
||||
|
||||
module triangle_braces() {
|
||||
translate([base_length/2+leg_offset+glass_recess+wall_width, 0, -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,0])
|
||||
linear_extrude(height = base_width+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=[[leg,0],[leg,base_height + floor_depth],[0,base_height + floor_depth]]);
|
||||
|
||||
translate([-(base_length/2+leg_offset+glass_recess+wall_width)-leg, 0, -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,0])
|
||||
linear_extrude(height = base_width+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=[[0,0],[leg,base_height + floor_depth],[0,base_height + floor_depth]]);
|
||||
|
||||
translate([0, -(base_width/2+leg+leg_offset+glass_recess+wall_width), -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,90])
|
||||
linear_extrude(height = base_length+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=[[0,0],[leg,base_height + floor_depth],[0,base_height + floor_depth]]);
|
||||
|
||||
translate([0, (base_width/2+leg_offset+glass_recess+wall_width), -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,90])
|
||||
linear_extrude(height = base_length+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=[[leg,0],[leg,base_height + floor_depth],[0,base_height + floor_depth]]);
|
||||
}
|
||||
|
||||
module curved_braces() {
|
||||
translate([base_length/2+leg_offset+glass_recess+wall_width, 0, -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,0])
|
||||
linear_extrude(height = base_width+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=curvedRightTriangle([leg,base_height + floor_depth],[leg,0],[0,base_height + floor_depth], 10, 0.2)[1]);
|
||||
|
||||
|
||||
|
||||
translate([-(base_length/2+leg_offset+glass_recess+wall_width)-leg, 0, -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,0])
|
||||
linear_extrude(height = base_width+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=curvedRightTriangle([0,base_height + floor_depth],[0,0],[leg,base_height + floor_depth], 10, 0.2)[1]);
|
||||
|
||||
|
||||
|
||||
translate([0, -(base_width/2+leg+leg_offset+glass_recess+wall_width), -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,90])
|
||||
linear_extrude(height = base_length+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=curvedRightTriangle([0,base_height + floor_depth],[leg,base_height + floor_depth],[0,0], 10, 0.2)[1]);
|
||||
|
||||
|
||||
|
||||
translate([0, (base_width/2+leg_offset+glass_recess+wall_width), -base_height/2 -floor_depth/2])
|
||||
rotate([90,0,90])
|
||||
linear_extrude(height = base_length+(leg+leg_offset+glass_recess+wall_width)*2, center = true) polygon(points=curvedRightTriangle([leg,base_height + floor_depth],[leg,0],[0,base_height + floor_depth], 10, 0.2)[1]);
|
||||
}
|
||||
|
||||
difference() {
|
||||
carve_cave();
|
||||
//triangle_braces();
|
||||
curved_braces();
|
||||
}
|
||||
|
||||
|
||||
// --- Vector helpers ---
|
||||
function v_add(a, b) = [a[0] + b[0], a[1] + b[1]];
|
||||
function v_sub(a, b) = [a[0] - b[0], a[1] - b[1]];
|
||||
function v_mul(v, s) = [v[0] * s, v[1] * s];
|
||||
|
||||
// Linear interpolation
|
||||
function lerp(a, b, t) =
|
||||
[ a[0] + (b[0] - a[0]) * t,
|
||||
a[1] + (b[1] - a[1]) * t ];
|
||||
|
||||
// Single curved point on hypotenuse
|
||||
function curved_point(A, O, H, t, scale) =
|
||||
let(
|
||||
P = lerp(O, H, t),
|
||||
curveFactor = -4 * t * (1 - t),
|
||||
toA = v_sub(A, P),
|
||||
offset = v_mul(toA, scale * curveFactor)
|
||||
)
|
||||
v_add(P, offset);
|
||||
|
||||
// Main function
|
||||
function curvedRightTriangle(A, O, H, count=20, scale=0.3) =
|
||||
let(
|
||||
hypotenuse = concat(
|
||||
[O],
|
||||
[ for (i = [1 : count-1])
|
||||
let(t = i / count)
|
||||
curved_point(A, O, H, t, scale)
|
||||
],
|
||||
[H]
|
||||
),
|
||||
triangle = concat([A, O], hypotenuse, [A])
|
||||
)
|
||||
[hypotenuse, triangle];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user