polyhaus/polyhaus.scad
Jens Heinrich 3210d36f3f geändert: polyhaus.scad
fixed orientation of the outer wall elements
added trigonometric helper functions
2019-05-12 23:55:58 +02:00

323 lines
6.9 KiB
OpenSCAD

// The Parameters of the House
// all in mm
level=3500;
wallstrength=500;
ceilingstrength=300;
floorstrength=200;
ringdiameter=14000;
ringstrength=2500;
garagediameter=ringdiameter+2000;
garageheigth=4000;
sides=6;
outer_wall_woodwidth=50;
outer_wall_strawwidth=1000;
// Reusable functions
// returns the inner circle radius given
// the angle
// wallstrengt
// and the diameter
//
//
function radius_in_circle(angle, diameter, wallstrength) =(
(cos(angle)*diameter)-
wallstrength
);
// returns the cleaned up value
// given
// angle,
// diameter,
// wallstrengt (measured 90° to the wall)
function radius_in_diameter(angle, wallstrength, diameter) = (
radius_in_circle(angle=angle, diameter=diameter, wallstrength=wallstrength)/ cos(angle));
// echo(radius_in_diameter(diameter=2,wallstrength=0,angle=45));
// should return 2
// return the length of the inside of wall
// given
// angle
// wallstrengt
// diameter
function sidelength_inside(angle,diameter,wallstrength)=(abs(sin(angle)*radius_in_diameter(angle,diameter,wallstrength)*2));
// echo(abs(sidelength_inside(diameter=2,wallstrength=0,angle=45)));
// should return 4
// The House Modules
module ngon(
diameter=5,
height=level,
sides=sides
)
{
cylinder(
h=height,
r=diameter/2,
$fn=sides
);
};
module garage(
garageheigth=garageheigth,
garagediameter=garagediameter
)
{
//color([0.1,0.1,1])
#translate([0,0,-garageheigth])
living(
floorstrength=2*floorstrength,
ceilingstrength=2*ceilingstrength
);
};
module ring(
ringdiameter=ringdiameter,
ringstrength=ringstrength,
ringheigth=level
)
{
//do the math for the radii
angle=(0.5*360/sides);
radius_in_circle=(sin(angle)*ringdiameter)-wallstrength;
echo("DEBUG RING radius_in_circle");
echo(radius_in_circle);
side_length=2*cos(0.5*360/sides)*radius_in_circle;
echo("DEBUG RING side_length");
echo(side_length);
radius_in_diameter=radius_in_circle/ sin(angle);
echo("DEBUG RING radius_in_diameter");
echo(radius_in_diameter);
#difference() {
ngon(
height=ringheigth,
diameter=ringdiameter,
sides=sides
);
%translate ([0,0, -1]) ngon(
height=ringheigth+2,
diameter=radius_in_diameter,
sides=sides
);
};
};
module living(
ringdiameter=ringdiameter,
ringstrength=ringstrength,
ringheigth=level,
floorstrength=floorstrength,
ceilingstrength=ceilingstrength,
wallstrength=wallstrength
)
{
angle=(0.5*360/sides);
radius_in_circle=(sin(angle)*ringdiameter)-wallstrength;
radius_in_diameter=radius_in_circle/ sin(angle);
side_length=2*acos(0.5*360/sides)*radius_in_circle;
#
difference() {
%ring();
echo("DEBUG LIVING building inner ring");
translate([0,0,+floorstrength])
ring(
ringdiameter=radius_in_diameter,
ringstrength=ringstrength-2*wallstrength,
ringheigth=level-(floorstrength+ceilingstrength));
};
};
module spar(
spar_width,
spar_depth,
spar_height
)
{
echo("DEBUG SPAR creating spar");
echo("DEBUG SPAR spar vars");
echo(
spar_width,
spar_depth,
spar_height
);
translate(
[0.5*spar_width,
0.5*spar_depth,
0] )
cube(
size=[
spar_width,
spar_depth,
spar_height
]
);
}
module draw_spars(
spar_offset,
outer_wall_woodwidth,
wallstrength,
ringheigth
)
{
echo("DEBUG draw_spars drawing spars");
echo("DEBUG draw_spars vars:( spar_offset, outer_wall_woodwidth, wallstrength, ringheigth)");
echo(
spar_offset,
outer_wall_woodwidth,
wallstrength,
ringheigth
);
// positive spar
translate (
[
spar_offset,
0,
0
//radius_in_circle
] )
spar(
spar_width=outer_wall_woodwidth,
spar_depth=wallstrength,
spar_height=ringheigth
);
// mirrored / negative spar
translate (
[
-spar_offset,
0,
0
//radius_in_circle
] )
spar(
spar_width=outer_wall_woodwidth,
spar_depth=wallstrength,
spar_height=ringheigth
);
}
module outer_wall(
ringdiameter=ringdiameter,
ringstrength=ringstrength,
ringheigth=level,
floorstrength=floorstrength,
ceilingstrength=ceilingstrength
)
{
echo("DEBUG OUTER WALL building with ringdiameter, ringstrength,ringheigth,floorstrength,ceilingstrength");
echo(ringdiameter, ringstrength,ringheigth,floorstrength,ceilingstrength);
angle=0.5*360/sides;
echo("DEBUG angle");
echo(angle);
radius_in_circle=floor(
radius_in_circle(diameter=ringdiameter,angle=angle,wallstrength=wallstrength)
// (cos(angle)*ringdiameter)-
// wallstrength
);
echo("DEBUG radius_in_circle");
echo(radius_in_circle(diameter=ringdiameter,angle=angle,wallstrength=wallstrength));
echo("DEBUG radius_in_diameter")
echo(radius_in_diameter(diameter=ringdiameter,angle=angle,wallstrength=wallstrength));
side_length=round(sidelength_inside(diameter=ringdiameter,angle=angle,wallstrength=wallstrength)
//2*cos(angle)*radius_in_circle
);
echo("DEBUG side_lenght");
echo(side_length);
elements=floor(side_length/(outer_wall_woodwidth+outer_wall_strawwidth));
echo("DEBUG elements");
echo(elements);
for(side=[1:sides] )
{
// rotate the outerwall to every side of the building
rotate(angle+2*side*angle)
translate(
[
radius_in_circle+
wallstrength,
0,
0
]
)
{
echo("DEBUG running through sides");
echo(side);
rotate( [0,0,90])
{
echo("DEBUG OUTER WALL building spars");
if (elements%2==1)
{
echo("DEBUG uneven number");
// center the middle modeline
for (spar= [0:elements/2])
{
echo("DEBUG OUTER WALL planking");
echo("DEBUG OUTER WALL spar");
echo(spar);
offset = (
0.5* outer_wall_strawwidth +
spar*(outer_wall_woodwidth +
outer_wall_strawwidth)
);
echo("DEBUG OUTER WALL offset for spar");
echo(offset);
echo("DEBUG OUTER WALL spar vars");
echo(
outer_wall_woodwidth,
wallstrength,
ringheigth
);
draw_spars(
offset,
outer_wall_woodwidth,
wallstrength,
ringheigth
);
}
}
if (elements%2==0)
{
echo("DEBUG even number");
// center the middle modeline
for (spar= [0:elements/2])
{
echo("DEBUG OUTER WALL planking");
echo("DEBUG OUTER WALL spar");
echo(spar);
// offset "along" the wall
offset= (0.5* outer_wall_strawwidth +
spar*(outer_wall_woodwidth+
outer_wall_strawwidth));
echo("DEBUG OUTER WALL offset for spar");
echo(offset);
echo("DEBUG OUTER WALL spar vars");
echo(
outer_wall_woodwidth,
wallstrength,
ringheigth
);
draw_spars(
offset,
outer_wall_woodwidth,
wallstrength,
ringheigth=ringheigth
);
}
}
}
}
};
}
living();
translate([0,0,level]) living();
garage();
outer_wall();
//ring();