No BSD License  

Highlights from
Sierpinski Sponge

image thumbnail
from Sierpinski Sponge by Moses Boone
Generates the Sierpinski Sponge.

Sponge(n)
%This function generates the Sierpinski Sponge.
% n=level of iterations
function Sponge(n)
if (n==0)
   vertices=[0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];
   faces=[1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
   patch('Vertices',vertices,'Faces',faces,'FaceVertexCData',hsv(6),'FaceColor','flat')
   good_axis
else
   levelcontrol=10^n;
   L=(levelcontrol/(3^n));  
   l=ceil(L);
   carp(0,0,0,levelcontrol,0,0,levelcontrol,levelcontrol,0,0,levelcontrol,0,0,0,levelcontrol,levelcontrol,0,levelcontrol,levelcontrol,levelcontrol,levelcontrol,0,levelcontrol,levelcontrol,l)
   good_axis;
end
%--------------------------------------------------------------------------
function carp(x1,y1,z1,x4,y4,z4,x52,y52,z52,x49,y49,z49,x13,y13,z13,x16,y16,z16,x64,y64,z64,x61,y61,z61,limit)
if(abs(x1-x4)>limit|abs(x16-x4)>limit|abs(x16-x13)>limit|abs(x13-x1)>limit|abs(x1-x49)>limit|abs(x61-x49)>limit|abs(x61-x13)>limit|abs(x64-x16)>limit|abs(x64-x52)>limit|abs(x52-x4)>limit|abs(x64-x61)>limit|abs(x52-x49)>limit|...
      abs(y1-y4)>limit|abs(y16-y4)>limit|abs(y16-y13)>limit|abs(y13-y1)>limit|abs(y1-y49)>limit|abs(y61-y49)>limit|abs(y61-y13)>limit|abs(y64-y16)>limit|abs(y64-y52)>limit|abs(y52-y4)>limit|abs(y64-y61)>limit|abs(y52-y49)>limit|...
      abs(z1-z4)>limit|abs(z16-z4)>limit|abs(z16-z13)>limit|abs(z13-z1)>limit|abs(z1-z49)>limit|abs(z61-z49)>limit|abs(z61-z13)>limit|abs(z64-z16)>limit|abs(z64-z52)>limit|abs(z52-z4)>limit|abs(z64-z61)>limit|abs(z52-z49)>limit)
   
   a=abs((x4-x1)/3);
   b=abs((y49-y1)/3);
   c=abs((z13-z1)/3);
   
   x2=x1+a;    y2=y1;      z2=z1;                  
   x3=x1+2*a;  y3=y1;      z3=z1;
   x5=x1;      y5=y1;      z5=z1+c;
   x6=x1+a;    y6=y1;      z6=z1+c;
   x7=x1+2*a;  y7=y1;      z7=z1+c;
   x8=x4;      y8=y1;      z8=z1+c;
   x9=x1;      y9=y1;      z9=z1+2*c;
   x10=x1+a;   y10=y1;     z10=z1+2*c;
   x11=x1+2*a; y11=y1;     z11=z1+2*c;
   x12=x4;     y12=y1;     z12=z1+2*c;
   x14=x1+a;   y14=y1;     z14=z13;
   x15=x1+2*a; y15=y1;     z15=z13;
   x17=x1;     y17=y1+b;   z17=z1;
   x18=x1+a;   y18=y1+b;   z18=z1;
   x19=x1+2*a; y19=y1+b;   z19=z1;
   x20=x4;     y20=y1+b;   z20=z1;
   x21=x1;     y21=y1+b;   z21=z1+c;
   x22=x1+a;   y22=y1+b;   z22=z1+c;
   x23=x1+2*a; y23=y1+b;   z23=z1+c;
   x24=x4;     y24=y1+b;   z24=z1+c;
   x25=x1;     y25=y1+b;   z25=z1+2*c;
   x26=x1+a;   y26=y1+b;   z26=z1+2*c;
   x27=x1+2*a; y27=y1+b;   z27=z1+2*c;
   x28=x4;     y28=y1+b;   z28=z1+2*c;
   x29=x1;     y29=y1+b;   z29=z13;
   x30=x1+a;   y30=y1+b;   z30=z13;
   x31=x1+2*a; y31=y1+b;   z31=z13;
   x32=x4;     y32=y1+b;   z32=z13;
   x33=x1;     y33=y1+2*b; z33=z1;
   x34=x1+a;   y34=y1+2*b; z34=z1;
   x35=x1+2*a; y35=y1+2*b; z35=z1;
   x36=x4;     y36=y1+2*b; z36=z1;
   x37=x1;     y37=y1+2*b; z37=z1+c;
   x38=x1+a;   y38=y1+2*b; z38=z1+c;
   x39=x1+2*a; y39=y1+2*b; z39=z1+c;
   x40=x4;     y40=y1+2*b; z40=z1+c;
   x41=x1;     y41=y1+2*b; z41=z1+2*c;
   x42=x1+a;   y42=y1+2*b; z42=z1+2*c;
   x43=x1+2*a; y43=y1+2*b; z43=z1+2*c;
   x44=x4;     y44=y1+2*b; z44=z1+2*c;
   x45=x1;     y45=y1+2*b; z45=z13;
   x46=x1+a;   y46=y1+2*b; z46=z13;
   x47=x1+2*a; y47=y1+2*b; z47=z13;
   x48=x4;     y48=y1+2*b; z48=z13;
   x50=x1+a;   y50=y49;    z50=z1;
   x51=x1+2*a; y51=y49;    z51=z1;
   x53=x1;     y53=y49;    z53=z1+c;
   x54=x1+a;   y54=y49;    z54=z1+c;
   x55=x1+2*a; y55=y49;    z55=z1+c;
   x56=x4;     y56=y49;    z56=z1+c;
   x57=x1;     y57=y49;    z57=z1+2*c;
   x58=x1+a;   y58=y49;    z58=z1+2*c;
   x59=x1+2*a; y59=y49;    z59=z1+2*c;
   x60=x4;     y60=y49;    z60=z1+2*c;
   x62=x1+a;   y62=y49;    z62=z13;
   x63=x1+2*a; y63=y49;    z63=z13;
   
   carp(x1,y1,z1,x2,y2,z2,x18,y18,z18,x17,y17,z17,x5,y5,z5,x6,y6,z6,x22,y22,z22,x21,y21,z21,limit);
   carp(x2,y2,z2,x3,y3,z3,x19,y19,z19,x18,y18,z18,x6,y6,z6,x7,y7,z7,x23,y23,z23,x22,y22,z22,limit);
   carp(x3,y3,z3,x4,y4,z4,x20,y20,z20,x19,y19,z19,x7,y7,z7,x8,y8,z8,x24,y24,z24,x23,y23,z23,limit);
   carp(x17,y17,z17,x18,y18,z18,x34,y34,z34,x33,y33,z33,x21,y21,z21,x22,y22,z22,x38,y38,z38,x37,y37,z37,limit);
   carp(x19,y19,z19,x20,y20,z20,x36,y36,z36,x35,y35,z35,x23,y23,z23,x24,y24,z24,x40,y40,z40,x39,y39,z39,limit);
   carp(x33,y33,z33,x34,y34,z34,x50,y50,z50,x49,y49,z49,x37,y37,z37,x38,y38,z38,x54,y54,z54,x53,y53,z53,limit);
   carp(x34,y34,z34,x35,y35,z35,x51,y51,z51,x50,y50,z50,x38,y38,z38,x39,y39,z39,x55,y55,z55,x54,y54,z54,limit);
   carp(x35,y35,z35,x36,y36,z36,x52,y52,z52,x51,y51,z51,x39,y39,z39,x40,y40,z40,x56,y56,z56,x55,y55,z55,limit);
   carp(x5,y5,z5,x6,y6,z6,x22,y22,z22,x21,y21,z21,x9,y9,z9,x10,y10,z10,x26,y26,z26,x25,y25,z25,limit);
   carp(x7,y7,z7,x8,y8,z8,x24,y24,z24,x23,y23,z23,x11,y11,z11,x12,y12,z12,x28,y28,z28,x27,y27,z27,limit);
   carp(x37,y37,z37,x38,y38,z38,x54,y54,z54,x53,y53,z53,x41,y41,z41,x42,y42,z42,x58,y58,z58,x57,y57,z57,limit);
   carp(x39,y39,z39,x40,y40,z40,x56,y56,z56,x55,y55,z55,x43,y43,z43,x44,y44,z44,x60,y60,z60,x59,y59,z59,limit);
   carp(x9,y9,z9,x10,y10,z10,x26,y26,z26,x25,y25,z25,x13,y13,z13,x14,y14,z14,x30,y30,z30,x29,y29,z29,limit);
   carp(x10,y10,z10,x11,y11,z11,x27,y27,z27,x26,y26,z26,x14,y14,z14,x15,y15,z15,x31,y31,z31,x30,y30,z30,limit);
   carp(x11,y11,z11,x12,y12,z12,x28,y28,z28,x27,y27,z27,x15,y15,z15,x16,y16,z16,x32,y32,z32,x31,y31,z31,limit);
   carp(x25,y25,z25,x26,y26,z26,x42,y42,z42,x41,y41,z41,x29,y29,z29,x30,y30,z30,x46,y46,z46,x45,y45,z45,limit);
   carp(x27,y27,z27,x28,y28,z28,x44,y44,z44,x43,y43,z43,x31,y31,z31,x32,y32,z32,x48,y48,z48,x47,y47,z47,limit);
   carp(x41,y41,z41,x42,y42,z42,x58,y58,z58,x57,y57,z57,x45,y45,z45,x46,y46,z46,x62,y62,z62,x61,y61,z61,limit);
   carp(x42,y42,z42,x43,y43,z43,x59,y59,z59,x58,y58,z58,x46,y46,z46,x47,y47,z47,x63,y63,z63,x62,y62,z62,limit);
   carp(x43,y43,z43,x44,y44,z44,x60,y60,z60,x59,y59,z59,x47,y47,z47,x48,y48,z48,x64,y64,z64,x63,y63,z63,limit);
else
   fillcub(x1,y1,z1,x4,y4,z4,x52,y52,z52,x49,y49,z49,x13,y13,z13,x16,y16,z16,x64,y64,z64,x61,y61,z61);
end
%--------------------------------------------------------------------------
function fillcub(a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4,c4,a5,b5,c5,a6,b6,c6,a7,b7,c7,a8,b8,c8)
verticesA=[a1,b1,c1;a2,b2,c2;a3,b3,c3;a4,b4,c4;a5,b5,c5;a6,b6,c6;a7,b7,c7;a8,b8,c8];
faces=[1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
patch('Vertices',verticesA,'Faces',faces,'FaceVertexCData',hsv(6),'FaceColor','flat');
hold on;
%--------------------------------------------------------------------------
function good_axis
axis equal
view(3)
set(gca,'Visible','off')

Contact us at files@mathworks.com