summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/examples/SierpinskiSponge.asy
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/examples/SierpinskiSponge.asy')
-rw-r--r--Build/source/utils/asymptote/examples/SierpinskiSponge.asy119
1 files changed, 88 insertions, 31 deletions
diff --git a/Build/source/utils/asymptote/examples/SierpinskiSponge.asy b/Build/source/utils/asymptote/examples/SierpinskiSponge.asy
index 328447d4ac4..c398aa511c6 100644
--- a/Build/source/utils/asymptote/examples/SierpinskiSponge.asy
+++ b/Build/source/utils/asymptote/examples/SierpinskiSponge.asy
@@ -1,42 +1,99 @@
size(200);
import palette;
import three;
-
+
+currentprojection=orthographic(1,1,1);
+
triple[] M={
(-1,-1,-1),(0,-1,-1),(1,-1,-1),(1,0,-1),
(1,1,-1),(0,1,-1),(-1,1,-1),(-1,0,-1),
(-1,-1,0),(1,-1,0),(1,1,0),(-1,1,0),
- (-1,-1,1),(0,-1,1),(1,-1,1),(1,0,1),
- (1,1,1),(0,1,1),(-1,1,1),(-1,0,1)
+ (-1,-1,1),(0,-1,1),(1,-1,1),(1,0,1),(1,1,1),(0,1,1),(-1,1,1),(-1,0,1)
};
-
-triple[] K={
- (1,-1,-1),(1,0,-1),(1,1,-1),(1,1,0),
- (1,1,1),(1,0,1),(1,-1,1),(1,-1,0),
- (0,0,-1),(0,0,1),(0,-1,0),(0,1,0)
+
+surface[] Squares={
+ surface((1,-1,-1)--(1,1,-1)--(1,1,1)--(1,-1,1)--cycle),
+ surface((-1,-1,-1)--(-1,1,-1)--(-1,1,1)--(-1,-1,1)--cycle),
+ surface((1,1,-1)--(-1,1,-1)--(-1,1,1)--(1,1,1)--cycle),
+ surface((1,-1,-1)--(-1,-1,-1)--(-1,-1,1)--(1,-1,1)--cycle),
+ surface((1,-1,1)--(1,1,1)--(-1,1,1)--(-1,-1,1)--cycle),
+ surface((1,-1,-1)--(1,1,-1)--(-1,1,-1)--(-1,-1,-1)--cycle),
};
-
-surface s;
-
-void recur(triple p, real u, int level) {
- if(level > 1 )
- for(triple V : M)
- recur(p+u*V,u/3,level-1);
- else
- for(triple V : K) {
- transform3 T=shift(p)*scale3(u)*shift(V)*scale3(0.5);
- surface t=T*surface((1,-1,-1)--(1,1,-1)--(1,1,1)--(1,-1,1)--cycle);
- s.append(t);
- s.append(scale3(-1)*t);
+
+int[][] SquaresPoints={
+ {2,3,4,10,16,15,14,9},
+ {0,7,6,11,18,19,12,8},
+ {4,5,6,11,18,17,16,10},
+ {2,1,0,8,12,13,14,9},
+ {12,13,14,15,16,17,18,19},
+ {0,1,2,3,4,5,6,7}
+};
+
+int[][] index={
+ {0,2,4},{0,1},{1,2,4},{2,3},{1,3,4},{0,1},{0,3,4},{2,3},
+ {4,5},{4,5},{4,5},{4,5},
+ {0,2,5},{0,1},{1,2,5},{2,3},{1,3,5},{0,1},{0,3,5},{2,3}
+};
+
+int[] Sponge0=array(n=6,value=1);
+
+int[] eraseFaces(int n, int[] Sponge0) {
+ int[] temp=copy(Sponge0);
+ for(int k : index[n]) {
+ temp[k]=0;
+ }
+ return temp;
+}
+
+int[][] Sponge1=new int[20][];
+for(int n=0; n < 20; ++n) {
+ Sponge1[n]=eraseFaces(n,Sponge0);
+}
+
+int[][] eraseFaces(int n, int[][] Sponge1) {
+ int[][] temp=copy(Sponge1);
+ for(int k : index[n])
+ for(int n1 : SquaresPoints[k])
+ temp[n1][k]=0;
+ return temp;
+}
+
+int[][][] Sponge2=new int[20][][];
+for(int n=0; n < 20; ++n)
+ Sponge2[n]=eraseFaces(n,Sponge1);
+
+int[][][] eraseFaces(int n, int[][][] Sponge2) {
+ int[][][] temp=copy(Sponge2);
+ for(int k : index[n])
+ for(int n2: SquaresPoints[k])
+ for(int n1: SquaresPoints[k])
+ temp[n2][n1][k]=0;
+ return temp;
+}
+
+int[][][][] Sponge3=new int[20][][][];
+for(int n=0; n < 20; ++n)
+ Sponge3[n]=eraseFaces(n,Sponge2);
+
+surface s3;
+real u=2/3;
+for(int n3=0; n3 < 20; ++n3) {
+ surface s2;
+ for(int n2=0; n2 < 20; ++n2) {
+ surface s1;
+ for(int n1=0; n1 < 20; ++n1) {
+ for(int k=0; k < 6; ++k){
+ transform3 T=scale3(u)*shift(M[n1])*scale3(0.5);
+ if(Sponge3[n3][n2][n1][k] > 0) {
+ s1.append(T*Squares[k]);
+ }
+ }
}
+ transform3 T=scale3(u)*shift(M[n2])*scale3(0.5);
+ s2.append(T*s1);
+ }
+ transform3 T=scale3(u)*shift(M[n3])*scale3(0.5);
+ s3.append(T*s2);
}
-
-recur((0,0,0),1/3,3);
-
-surface sf;
-sf.append(s);
-sf.append(rotate(90,Y)*s);
-sf.append(rotate(90,Z)*s);
-sf.colors(palette(sf.map(abs),Rainbow()));
-
-draw(sf,render(compression=Low,merge=true));
+s3.colors(palette(s3.map(abs),Rainbow()));
+draw(s3);