/** * Diffraction de nombres premiers. * Les bandes foncées correspondent aux distances (gaps) entre nombres premiers. * Bougez la souris pour modifier la vitesse ou les nombres. * Click = stop/start. * (C) René et les filles et Processing - 2012 */ boolean PERFORM_isprime (int n) { // n always odd and >=3 // if (n <= 2) return (n==2); // if( (n & 1) == 0 ) return false; for ( int p= 3; p*p <= n; p+= 2) if (n % p == 0) return false; return true; } // END PERFORM int W= 2; // stroke width int speed = 40; // frames/sec int dim = 150; // half square int r = 1; // circle radius float maxr = dim*2*0.9; int p = 3; int loops = 0; int HUE = 50; boolean stopped = false; color c1, c2; void setup() { size(300, 300); frameRate(speed); smooth(); background(0); PFont font = loadFont("myfont.vlw"); colorMode(HSB, 100); noFill(); c1=color(HUE, 100, 100); c2=color(HUE, 100, 20); textFont(font, 16); } void mouseClicked() { stopped = ! stopped; if (stopped) noLoop(); else loop(); } void mouseMoved () { frameRate(map(mouseX, 0, width-1, 2, 1000)); float e = map (mouseY, 0, height-1, 0, log(2*1000000000.)); p = (int) exp(e); // prime between 3 and 2*10**9 if (p < 3) p = 3 ; } void draw() { translate(dim, dim); // (0,0) at center p++ ; r+=W; if (++loops> 50) { // gradually change hue loops = 0; if (++HUE > 100) HUE = 0; c1=color(HUE, 100, 100); // start gradient c2=color(HUE, 100, 20); // end gradient } strokeWeight(W); float g = map(r, 0, maxr, 0.2, 1); // gradient from center to max radius color newc = lerpColor(c1, c2, g); // compute gradient stroke(newc); if ((p & 1) == 1) if (PERFORM_isprime(p)) { colorMode(RGB, 255); noStroke(); fill(0); rect(-dim+2, -dim, 100, 30); fill(255); text(p, -dim+2, -dim+20); // draws number top right colorMode(HSB, 100); stroke(c1); // stroke prime with max intensity } noFill(); ellipse(0, 0, r, r); if (r > maxr) { r = 1; background(0); } }