Add honeycombs.scad.
This commit is contained in:
parent
d421f915fb
commit
35113c9a79
1 changed files with 105 additions and 0 deletions
105
voussoir/honeycombs.scad
Normal file
105
voussoir/honeycombs.scad
Normal file
|
@ -0,0 +1,105 @@
|
|||
module cookiecutter_inset(distance)
|
||||
{
|
||||
/*
|
||||
Given a 2D polygon, return a "cookie cutter" of thickness `distance` where
|
||||
the outer edge of the cookiecutter is the outer edge of the original shape.
|
||||
*/
|
||||
difference()
|
||||
{
|
||||
children();
|
||||
offset(-distance) children();
|
||||
}
|
||||
}
|
||||
|
||||
module honeycomb_tiles(outer_radius, inner_radius, x_span, y_span, center=false)
|
||||
{
|
||||
/*
|
||||
Returns a tiling of 2D hexagons.
|
||||
|
||||
outer_radius:
|
||||
The radius which controls the spacing between centers of hexagons.
|
||||
The "personal space" of each hex.
|
||||
|
||||
inner_radius:
|
||||
The radius of each hexagon itself. Smaller values will leave bigger
|
||||
channels in between each hex.
|
||||
|
||||
x_span,
|
||||
y_span:
|
||||
The dimensions of the rectangle which more or less encloses the tiles.
|
||||
|
||||
center:
|
||||
The tiling will be roughly centered around the origin.
|
||||
*/
|
||||
// In a densely packed tiling of circles / hexagons, the centers of two
|
||||
// diagonal circles make a triangle of x=radius, y=sqrt(3), hyp=diameter.
|
||||
// The x=radius offset is done by translating x on odd rows. The y=sqrt(3)
|
||||
// offset is done by multiplying the row by sqrt(3)/2, compressing the rows
|
||||
// to the appropriate density.
|
||||
diameter = outer_radius * 2;
|
||||
y_step = sqrt(3) / 2;
|
||||
x_count = floor(x_span / diameter);
|
||||
y_count = floor(y_span / (diameter * y_step));
|
||||
|
||||
actual_x_span = (x_count + 0.5) * diameter;
|
||||
actual_y_span = y_count * y_step * diameter;
|
||||
|
||||
x_translate = center==true ? (-actual_x_span / 2) : 0;
|
||||
y_translate = center==true ? (-actual_y_span / 2) : 0;
|
||||
translate([x_translate, y_translate])
|
||||
union()
|
||||
{
|
||||
for(i=[0:1:x_count], j=[0:1:y_count])
|
||||
{
|
||||
alternate_offset = (j % 2) * outer_radius;
|
||||
translate([i * diameter + alternate_offset, (j * y_step) * diameter])
|
||||
rotate([0,0,30])
|
||||
circle(inner_radius, $fn=6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module honeycomb_mesh(outer_radius, inner_radius, x_span, y_span, center=false)
|
||||
{
|
||||
/*
|
||||
Returns a 2D rectangle with hexagonal holes throughout.
|
||||
*/
|
||||
difference()
|
||||
{
|
||||
square([x_span, y_span], center=center);
|
||||
// Make the tiling bigger so we're sure it fills the whole square.
|
||||
honeycomb_tiles(
|
||||
outer_radius,
|
||||
inner_radius,
|
||||
x_span+3*outer_radius,
|
||||
y_span+3*outer_radius,
|
||||
center=center
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module interior_honeycomb(
|
||||
outer_radius,
|
||||
inner_radius,
|
||||
x_span,
|
||||
y_span,
|
||||
perimeter,
|
||||
rotate=0,
|
||||
center=false
|
||||
)
|
||||
{
|
||||
/*
|
||||
Given a 2D polygon children(), returns a 2D polygon with an internal
|
||||
honeycomb while preserving a solid perimeter.
|
||||
*/
|
||||
union()
|
||||
{
|
||||
cookiecutter_inset(perimeter) children();
|
||||
intersection()
|
||||
{
|
||||
rotate([0, 0, rotate])
|
||||
honeycomb_mesh(outer_radius, inner_radius, x_span, y_span, center=center);
|
||||
children();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue