1// Menger Sponge
2
3// Size of edge of sponge
4D=100;
5// Fractal depth (number of iterations)
6n=3;
7
8echo(version=version());
9
10module menger() {
11  difference() {
12    cube(D, center=true);
13    for (v=[[0,0,0], [0,0,90], [0,90,0]])
14      rotate(v) menger_negative(side=D, maxside=D, level=n);
15  }
16}
17
18module menger_negative(side=1, maxside=1, level=1) {
19  l=side/3;
20  cube([maxside*1.1, l, l], center=true);
21  if (level > 1) {
22    for (i=[-1:1], j=[-1:1])
23      if (i || j)
24        translate([0, i*l, j*l])
25          menger_negative(side=l, maxside=maxside, level=level-1);
26  }
27}
28
29difference() {
30  rotate([45, atan(1/sqrt(2)), 0]) menger();
31  translate([0,0,-D]) cube(2*D, center=true);
32}
33
34// Written by Nathan Hellweg, Emmett Lalish and Marius Kintel May 13, 2013
35//
36// To the extent possible under law, the author(s) have dedicated all
37// copyright and related and neighboring rights to this software to the
38// public domain worldwide. This software is distributed without any
39// warranty.
40//
41// You should have received a copy of the CC0 Public Domain
42// Dedication along with this software.
43// If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
44