Diamond fractal (see; http://www.ams.org/books/memo/0932/)
settings.outformat="pdf";
unitsize(10cm);
pair[] vertex;
vertex = new pair[3];
vertex[0]=(0, 1);
for(int j=1; j<3; ++j) {
vertex[j]= rotate(120, (0,0))* vertex[j-1] ;
}
path a = vertex[0] -- vertex[1] -- vertex[2] --cycle;
draw(a,dashed);
/* dashed*/
pair[] vertex_center;
vertex_center = new pair[3];
for(int j=0; j<3; ++j) {
vertex_center[j]= (1- 0.333333333333333) * vertex[j];
}
dot(vertex_center);
pair p = (vertex[0] + vertex[1] + vertex[2])/3;
pair[] middle;
middle = new pair[3];
for(int j=0; j<3; ++j) {
middle[j]= vertex[j]-p;
}
dot(middle);
pair[] vertex_rot;
vertex_rot = new pair[6];
for(int j=0; j<6; ++j) {
if(j<3){
vertex_rot[j] =vertex[j];
}else
vertex_rot[j] = (3*p + vertex_rot[j-3])/4;
}
dot(middle);
pair comp (pair a, pair b) {\
return (dot(a, reflect((0,0),(1,0))*b),cross(reflect((0,0),(1,0))*a,b));
}
pair[] middle_center;
middle_center = new pair[6];
for(int j=0; j<6; ++j) {
if(j<3){
middle_center[j]= vertex_center[j];
}else
middle_center[j]= vertex_rot[j]+ scale(0.333333333333333)*scale(1/length(middle[j-3]))* comp(comp(middle[j-3],middle[j-3]),reflect((0,0),(1,0))*vertex_rot[j]);
}
dot(middle_center);
path b = scale(0.33333333333)*a;
/*path c = scale(-0.333333333333333)*scale(1/length(middle[j-3]))* comp(comp(middle[j-3],middle[j-3]),reflect((0,0),(1,0))*a); */
path[] ver_path;
ver_path = new path[6];
ver_path[0] =shift(middle_center[0])*scale(0.33333333333)*a;
for(int j=1; j<6; ++j) {
if(j<3){
ver_path[j] =rotate(120,(0,0))*ver_path[j-1];
}else
ver_path[j] = reflect(point(ver_path[j-3],1),point(ver_path[j-3],2))*ver_path[j-3];
}
draw(ver_path);
path[][] contra;
contra = new path[6][6];
for(int j=0; j<6; ++j) {
for(int i=0; i<6; ++i) {
if(i<3){
contra[i][j]= shift(middle_center[i])*scale(0.33333)* ver_path[j];
}else{
contra[i][j]= reflect(point(ver_path[i-3],1),point(ver_path[i-3],2))*contra[i-3][j];
}
draw(contra[i][j],dashed);
}
}
path[][][] contra2;
contra2 = new path[6][6][6];
for(int k=0; k<6; ++k) {
for(int j=0; j<6; ++j) {
for(int i=0; i<6; ++i) {
if(i<3){
contra2[i][j][k]= shift(middle_center[i])*scale(0.33333)* contra[j][k];
}else{
contra2[i][j][k]= reflect(point(ver_path[i-3],1),point(ver_path[i-3],2))*contra2[i-3][j][k];
}
draw(contra2[i][j][k],dashed);
}
}
}
path[][][][] contra3;
contra3 = new path[6][6][6][6];
for(int l=0; l<6; ++l) {
for(int k=0; k<6; ++k) {
for(int j=0; j<6; ++j) {
for(int i=0; i<6; ++i) {
if(i<3){
contra3[i][j][k][l]= shift(middle_center[i])*scale(0.33333)* contra2[j][k][l];
}else{
contra3[i][j][k][l]= reflect(point(ver_path[i-3],1),point(ver_path[i-3],2))*contra3[i-3][j][k][l];
}
draw(contra3[i][j][k][l],dashed);
}
}
}
}
path[][][][][] contra4;
contra4 = new path[6][6][6][6][6];
for(int m=0; m<6; ++m) {
for(int l=0; l<6; ++l) {
for(int k=0; k<6; ++k) {
for(int j=0; j<6; ++j) {
for(int i=0; i<6; ++i) {
if(i<3){
contra4[i][j][k][l][m]= shift(middle_center[i])*scale(0.33333)* contra3[j][k][l][m];
}else{
contra4[i][j][k][l][m]= reflect(point(ver_path[i-3],1),point(ver_path[i-3],2))*contra4[i-3][j][k][l][m];
}
draw(contra4[i][j][k][l][m],dashed);
}
}
}
}
}
path[][][][][][] contra5;
contra5 = new path[6][6][6][6][6][6];
for(int n=0; n<6; ++n) {
for(int m=0; m<6; ++m) {
for(int l=0; l<6; ++l) {
for(int k=0; k<6; ++k) {
for(int j=0; j<6; ++j) {
for(int i=0; i<6; ++i) {
if(i<3){
contra5[i][j][k][l][m][n]= shift(middle_center[i])*scale(0.33333)* contra4[j][k][l][m][n];
}else{
contra5[i][j][k][l][m][n]= reflect(point(ver_path[i-3],1),point(ver_path[i-3],2))*contra5[i-3][j][k][l][m][n];
}
draw(contra5[i][j][k][l][m][n]);
}
}
}
}
}

