/******************************* * Modified version by "ker2x" * December, 2009 * http://www.keru.org/ ******************************** * Original credit below : * * // Buddhabrot * // j.tarbell January, 2004 * // Albuquerque, New Mexico * // complexification.net * * // based on code by Paul Bourke * // astronomy.swin.edu.au/~pbourke/ * * // Processing 0085 Beta syntax update * // j.tarbell April, 2005 ********************************/ /* Some documentation here : http://warp.povusers.org/Mandelbrot/ */ int dim = 800; // screen dimensions (square window) int bailout = 10000; // number of iterations before bail int plots = 100000; // number of plots to execute per frame (x30 = plots per second) // 2D array to hold exposure values int[] Rexposure = new int[dim*dim]; int[] Gexposure = new int[dim*dim]; int[] Bexposure = new int[dim*dim]; int maxRexposure = 0; // maximum exposure value int maxGexposure = 0; // maximum exposure value int maxBexposure = 0; // maximum exposure value int time = 0; int exposures = 0; float r = 1; float g = 1; float b = 1; boolean drawing; PFont metaBold; // MAIN ---------------------------------------------------------------- void setup() { // set up drawing area size(dim,dim,P3D); background(0); // take it nice and easy frameRate(1500); // load typeface metaBold = loadFont("Arial-48.vlw"); } void draw() { plotPlots(); time++; // show progress every 2 seconds or so... if (time%30==0) { findMaxExposure(); renderBrot(); // show exposure value fill(255); noStroke(); textFont(metaBold, 14); text("bailout: "+bailout+" exposures: "+exposures + " framerate : " + (int)frameRate, 5, dim-6 ); } } void plotPlots() { float x, y; x = random(-2.0,1.0); y = random(-1.5,1.5); // iterate through some plots if (iterate(x,y,false)) { for (int n=0;n 1) { Rramp = 1; } float Gramp = sqrt(Gexposure[i*dim+j] / (maxGexposure / 2.5)); // blow out ultra bright regions if (Gramp > 1) { Gramp = 1; } float Bramp = sqrt(Bexposure[i*dim+j] / (maxBexposure / 2.5)); // blow out ultra bright regions if (Bramp > 1) { Bramp = 1; } color c = color(int(Rramp*255*r), int(Gramp*255*g), int(Bramp*255*b)); set(j,i,c); } } } // Iterate the Mandelbrot and return TRUE if the point exits // Also handle the drawing of the exit points boolean iterate(float x0, float y0, boolean drawIt) { float x = 0; float y = 0; float xnew = 0.0; float ynew = 0.0; int ix,iy; //for (int i=0;i 5)) { ix = int(dim * (xnew + 2) / 3.0); iy = int(dim * (ynew + 1.5) / 3.0); if (ix >= 0 && iy >= 0 && ix < dim && iy < dim) { if(i < 2000) { Rexposure[ix*dim+iy]++; } if(i > 2000 && i < 5000) { Gexposure[ix*dim+iy]++; } if(i > 5000) { Bexposure[ix*dim+iy]++; } } } if ((xnew*xnew + ynew*ynew) > 4) { // escapes return true; } x = xnew; y = ynew; } // does not escape return false; } void findMaxExposure() { // assume no exposure maxRexposure=0; maxGexposure=0; maxBexposure=0; // find the largest density value for(int i=0; i < Rexposure.length; i++) { if(Rexposure[i] > maxRexposure) { maxRexposure = Rexposure[i]; } } for(int i=0; i < Gexposure.length; i++) { if(Gexposure[i] > maxGexposure) { maxGexposure = Gexposure[i]; } } for(int i=0; i < Rexposure.length; i++) { if(Bexposure[i] > maxBexposure) { maxBexposure = Bexposure[i]; } } } // Buddhabrot // j.tarbell January, 2004