/* */ /* Program ufattr to generate random */ /* iterative formulas and to compute */ /* their attractors */ /* */ import java.io.*; class ufattr { static int Xscreen = 200,Yscreen=200; static double Left= -4.,Right= 4.,Bottom= -4.,Top= 4.; static int numcol = 256; static int maxiter = 1000; static double x,y,x0,y0,w,temp,xsav,ysav,Deltax,Deltay; static int i,j,ib,iter,ic,l,j1,n; static double stack[] = new double[50]; static double stack1[] = new double[50]; static int istack,k,numpull; static int iexe[][] = new int[2][50]; static double p[] = new double[2],p0[] = new double[2]; static int img[][] = new int[200] [200]; static int npixset = 0,npixsetmax,npixsetmax1=1000; static int ntry = 0; /* nsel,isel and c contain the randomly generated formula*/ static int nsel[] = new int[2],isel[][] = new int[2][50]; static double c[][] = new double[2][50]; static int Nxpixel = 200,Nypixel = 200; static double xmin,xmax,ymin,ymax; public static void main(String[] argv) { try { FileOutputStream out = new FileOutputStream("temp.out"); PrintStream myOutput = new PrintStream(out); System.out.println("seed = "+Math.random()); if (argv.length > 0)npixsetmax1=Integer.parseInt(argv[0]); System.out.println("npixsetmax1 = "+npixsetmax1); npixsetmax=npixsetmax1; for ( n = 1; n < 10000 ; n ++){ npixset = 0; while(npixset <= npixsetmax){ maxiter = 1000; /* Initialize array img */ for(i=0; i < Xscreen; i++) for(j=0; j < Yscreen; j++) img[i] [j] = 0; // if(npixset>100)System.out.println(npixset); npixset = 0; ntry = ntry + 1; if((ntry % 10000) == 0) System.out.println("ntry = "+ntry); /* Generate here random formula */ if (Math.random() > 0.5) { npixsetmax=npixsetmax1-(npixsetmax1/6); i = 0;nsel[1]=0; nsel[i] = (int) (Math.random()*49.+2.); for(j=0; j < nsel[i]; j++) { isel [i] [j] = (int) (Math.random()*22. + 1.); c [i] [j] = Math.random()*2. -1.; c [1] [j] = Math.random()*2. -1.; } }else{ npixsetmax=npixsetmax1; for(i=0; i < 2; i++) { nsel[i] = (int) (Math.random()*49.+2.); for(j=0; j < nsel[i]; j++) { isel [i] [j] = (int) (Math.random()*22. + 1.); c [i] [j] = Math.random()*2. -1.; } } } /*Force first command to be a set accumulator */ /* command; not necessary but will speed up */ /* formula computation */ for(i=0; i < 2; i++) { isel [i] [0] = (int)(Math.random()*3. + 13.); } /* This is to speed up formula computation */ /* The accumulator value is pushed in the stack only */ /* if there is a subsequent command that uses the stack */ /* iexe[i][j]=0 means that the command isel [i][j] must */ /* be ignored. */ for(i=0; i < 2; i++) for(j=0; j < nsel[i]; j++) iexe[i][j] = 1; for (j=0; j < 2; j++) { for (i=0; i < nsel[j]; i++) { if(isel[j][i] > 15 && isel[j][i] < 19) { numpull = 0; if((i+1) < nsel[j]) { for(k = i+1; k < nsel[j]; k++) { if(isel[j][k] > 15 && isel[j][k] < 19) numpull = numpull - 1; if(isel[j][k] > 18 && isel[j][k] < 23) numpull = numpull + 1; if(numpull == 1) break; } } if(numpull != 1) iexe[j][i] = 0; } } } /* Main loop to compute attractor */ x0 = Math.random()*(Right-Left)+Left; y0 = Math.random()*(Top-Bottom)+Bottom; xsav = x0; ysav = y0; x = x0 ; y = y0; iter = 0; xmin = 4.; xmax = -4.; ymin = 4.; ymax = -4.; while(iter <= maxiter){ /* Iteration starts here */ p0[0] = x0; p0[1] = y0; for(i=0; i< 2; i++) { istack = 0; p[i] = p0[i]; for (k=0; k < nsel[i]; k++) { switch (isel[i][k]) { case 1: if(nsel[1]==0){ p[0] = p[0] + x0; p[1] = p[1] + y0; } else p[i] = p[i] + x0;break; case 2: if(nsel[1]==0){ p[0] = p[0] + x0; p[1] = p[1] + y0; } else p[i] = p[i] + y0;break; case 3: if(nsel[1]==0){ p[0] = p[0] + c[0][k]; p[1] = p[1] + c[1][k]; } else p[i] = p[i] + c[i][k];break; case 4: if(nsel[1]==0){ p[0] = p[0] - x0; p[1] = p[1] - y0; } else p[i] = p[i] - x0;break; case 5: if(nsel[1]==0){ p[0] = p[0] - x0; p[1] = p[1] - y0; } else p[i] = p[i] - y0;break; case 6: if(nsel[1]==0){ p[0] = p[0] - c[0][k]; p[1] = p[1] - c[1][k]; } else p[i] = p[i] - c[i][k];break; case 7: if(nsel[1]==0){ p[0] = p[0]*x0 - p[1]*y0; p[1] = p[0]*y0 + p[1]*x0; } else p[i] = p[i] * x0;break; case 8: if(nsel[1]==0){ temp = p[0]*x0 - p[1]*y0; p[1] = p[0]*y0 + p[1]*x0; p[0] = temp; } else p[i] = p[i] * y0;break; case 9: if(nsel[1]==0){ temp = p[0]*c[0][k] - p[1]*c[1][k]; p[1] = p[0]*c[1][k] + p[1]*c[0][k]; p[0] = temp; } else p[i] = p[i] * c[i][k];break; case 10: if(nsel[1]==0){ w = x0*x0 + y0*y0; if(w==0){p[0]=0;p[1]=0;} else{ temp=(p[0]*x0+p[1]*y0)/w; p[1]=(-p[0]*y0+p[1]*x0)/w; p[0] = temp; } } else if(x0 == 0.) p[i] = 0.; else p[i] = p[i] / x0;break; case 11: if(nsel[1]==0){ w = x0*x0 + y0*y0; if(w==0){p[0]=0;p[1]=0;} else{ temp=(p[0]*x0+p[1]*y0)/w; p[1]=(-p[0]*y0+p[1]*x0)/w; p[0] = temp; } } else if(y0 == 0.) p[i] = 0.; else p[i] = p[i] / y0;break; case 12: if(nsel[1]==0){ w = c[0][k]*c[0][k] + c[1][k]*c[1][k]; if(w==0){p[0]=0;p[1]=0;} else{ temp=(p[0]*c[0][k]+p[1]*c[1][k])/w; p[1]=(-p[0]*c[1][k]+p[1]*c[0][k])/w; p[0] = temp; } } else if(c[i][k] == 0.) p[i] = 0.; else p[i] = p[i] / c[i][k];break; case 13: if(k == 0) if(nsel[1]==0){ p[0] = x0; p[1] = y0; } else p[i] = x0;break; case 14: if(k == 0) if(nsel[1]==0){ p[0] = x0; p[1] = y0; } else p[i] = y0;break; case 15: if(k == 0) if(nsel[1]==0){ p[0] = c[0][k]; p[1] = c[1][k]; } else p[i] = c[i][k];break; case 16: if(iexe[i][k] == 1) if(nsel[1]==0){ istack = istack + 1; stack[istack] = p[0];stack1[istack]=p[1]; p[0] = x0; p[1] = y0; } else { istack = istack + 1; stack[istack] = p[i]; p[i] = x0; }break; case 17: if(iexe[i][k] == 1) if(nsel[1]==0){ istack = istack + 1; stack[istack] = p[0];stack1[istack]=p[1]; p[0] = x0; p[1] = y0; } else { istack = istack + 1; stack[istack] = p[i]; p[i] = y0; }break; case 18: if(iexe[i][k] == 1) if(nsel[1]==0){ istack = istack + 1; stack[istack] = p[0];stack1[istack]=p[1]; p[0] = c[0][k]; p[1] = c[1][k]; } else { istack = istack + 1; stack[istack] = p[i]; p[i] = c[i][k]; }break; case 19: if(istack > 0) if(nsel[1]==0){ p[0] = p[0] + stack[istack]; p[1] = p[1] + stack1[istack]; istack = istack -1; } else {p[i] = p[i] + stack[istack]; istack = istack - 1;}break; case 20: if(istack > 0) if(nsel[1]==0){ p[0] = p[0] - stack[istack]; p[1] = p[1] - stack1[istack]; istack = istack -1; } else {p[i] = p[i] - stack[istack]; istack = istack - 1;}break; case 21: if(istack > 0) if(nsel[1]==0){ temp = p[0]*stack[istack] - p[1]*stack1[istack]; p[1] = p[0]*stack1[istack] + p[1]*stack[istack]; p[0] = temp; istack = istack -1; } else {p[i] = p[i] * stack[istack]; istack = istack - 1;}break; case 22: if(istack > 0) if(nsel[1]==0){ w = stack[istack]*stack[istack]+stack1[istack]*stack1[istack]; if(w==0){p[0]=0;p[1]=0;} else { temp = (p[0]*stack[istack] + p[1]*stack1[istack])/w; p[1] = (-p[0]*stack1[istack] + p[1]*stack[istack])/w; p[0] = temp; } istack = istack -1; } else { if(stack[istack] == 0.) p[i] = 0.; else { p[i] = p[i] / stack[istack]; istack = istack - 1;}}break; } if(nsel[1]==0 && (Math.abs(p[0]) > 4 || Math.abs(p[1])>4))break; if(nsel[1]>0 && Math.abs(p[i]) > 4. )break; } if(nsel[1]==0 && (Math.abs(p[0]) > 4 || Math.abs(p[1])>4))break; if(nsel[1]>0 && Math.abs(p[i]) > 4. )break; } x = p[0]; y = p[1]; /* end of iteration */ if(Math.abs(x) < 1.e-10)x = 0.; if(Math.abs(y) < 1.e-10)y = 0.; if(Math.abs(x) > 4. || Math.abs(y) > 4.)break; iter = iter + 1; x0 = x; y0 = y; if(x > Left && x < Right && y > Bottom && y < Top){ if(iter > 1000) { if(x < xmin) xmin = x; if(x > xmax) xmax = x; if(y < ymin) ymin = y; if(y > ymax) ymax = y; } l = (int)((x-Left)/(Right-Left)*Xscreen); j = (int)((y-Bottom)/(Top-Bottom)*Yscreen); img [l] [j] = img [l] [j] + 1; if(img[l] [j] == 1) {npixset = npixset + 1;} if(npixset > (npixsetmax/10)) maxiter = 10000; if(npixset > npixsetmax) maxiter = 20000; if(iter > 1100 && npixset > (npixsetmax/10) && (xmin == xmax))maxiter = 1000; if(iter > 1100 && npixset > (npixsetmax/10) && (ymin == ymax))maxiter = 1000; ic = img[l] [j] % 250 + 3; } } } /* Save formula */ myOutput.println(n +" "+ nsel[0] +" "+ nsel[1]); System.out.println(n +" "+ nsel[0] +" "+ nsel[1]); for(i=0; i < 2; i++){ for(j=0; j < 50; j++) { myOutput.print(isel[i][j]+" "); if(((j+1) % 10) == 0)myOutput.print(" \n"); } } for(i=0; i < 2; i++){ for(j=0; j < 50; j++) { myOutput.print(c[i][j]+" "); if(((j+1) % 10) == 0)myOutput.print(" \n"); } } myOutput.println(xsav+" "+ysav); } } catch (IOException e) { System.out.println("Error: "+e); System.exit(1); } } }