int x = 0; int y = 0; int center = 200; float angle = 0; float r = 0; int NUM_PARTICLES = 3158; Particle[] particles = new Particle[ NUM_PARTICLES ]; int recursion = 0; void setup() { size( 400, 400 ); background( 0 ); smooth(); noStroke(); ackermann( 2, 56 ); } void draw() { fill( 0, 20 ); rect( 0, 0, 400, 400 ); for ( int i = 0; i < NUM_PARTICLES; i++ ) particles[ i ].render(); } int ackermann( int m, int n ) { x = center + (int)( cos( angle ) * r ); y = center + (int)( sin( angle ) * r ); angle += .05; r += .05; int c = max( m, n ) << 3; if ( c < 256 ) particles[ recursion++ ] = new Particle( x, y, c, angle, r ); /** * Ackermann function */ if ( m == 0 ) return n + 1; if ( m > 0 && n == 0 ) return ackermann( m - 1, 1 ); if ( m > 0 && n > 0 ) return ackermann( m - 1, ackermann( m, n - 1 ) ); return 0; } class Particle { int _x; int _y; int _c; float _a; float _r; float _ca; Particle( int x, int y, int c, float a, float r ) { _x = x; _y = y; _c = c; _a = a; _r = r; _ca = 0; } public void render() { float clr = cos( _a - _ca ) * 256; _c = (int)clr; _ca -= .001; _x = 200 + (int)( cos( _a ) * _r ); _y = 200 + (int)( sin( _a ) * _r ); _a += .02; if ( _x < -1 || _x > 401 || _y < -1 || _y > 401 ) return; fill( _c ); ellipse( _x, _y, 5, 5 ); } }