//========= dispersionSpherique.pde ================================ //Dispersion observé sur un dioptre sphérique pour introduire le phénomène de l'arc en ciel. //©J.roussel //Juillet 2012 : Création //9 Août 2012 : ajout des valeurs de la déviation et de l'intensité ainsi qu'un commentaire pour l'utilisation avec processing seul //2016-04-23 : ajout d'une fonction changeImpact appelé par la page HTML (requete javascript) //2017-01-17 : retrait de la fonction changeImpact. Dorénavant c'est la souris qui décide. //=================================================================== /* @pjs pauseOnBlur="true"; */ float indice;//indice de la sphère float xI,yI;//coordonnées (en pixel) du point d'impact int w1; //demi-largeur de l'écran int h1; //demi-hauteur de l'écran float IR,IG,IB; // intensité des rayons en RGB float ii1,it1;//angles incident,transmis et réfléchis color bleu1,bleu2;//couleurs de la goutte void setup() { size(400,400); smooth(); strokeWeight(1); frameRate(15); w1=int(width/2); h1=int(height/2); text("",0,0); // force Processing to load a font textSize(12); //couleurs colorMode(RGB,1.0); bleu1=color(0,0.75,0.816); bleu2=color(0,0.75,0.816,0.2); yI=-80; } void draw() { background(.8); fill(0); text("© Jimmy Roussel",width-100,16); traceSphere(); yI=constrain(mouseY-h1,-99.5,99.5); xI=-sqrt(10000-yI*yI); traceRayons(xI,yI);//tracé des rayons ecrireDetI(580.); } void traceSphere() { pushMatrix(); translate(w1,h1);//centrage de l'origine du repère fill(bleu2); stroke(bleu1); ellipse(0,0,200,200);//dioptre sphérique de rayon 100px popMatrix(); } void traceRayons(float xx, float yy) { float t12,t21,r12,r21;//coefficients de transmission et de réflexion (en NRJ) pour une lumière non polarisée int N=100;//nombre de rayons envoyés pushMatrix(); translate(w1,h1); stroke(1); line(-w1,yy,xx,yy); popMatrix(); float lambda=400; for (int i=0;iRGB **************** void lambdaToRgb(float x) { float R=1; float G=1; float B=1; float sat=1; if(x<440. && x>=380.) { R=(440.-x)/60; G=0; B=1.; } if(x<490. && x>=440.) { R=0; G=(x-440.)/50.; B=1.; } if(x<510. && x>=490.) { R=0; G=1.; B=(510.-x)/20.; } if(x<580. && x>=510.) { R=(x-510.)/70.; G=1.; B=0; } if(x<645. && x>=580.) { R=1; G=(645.-x)/65.; B=0; } if(x<780. && x>=645.) { R=1.; G=0; B=0; } if(x>700.) { sat=0.3+0.7*(780.-x)/80.; } if(x<420.) { sat=0.3+0.7*(x-380.)/40.; } IR=(sat*R); IG=(sat*G); IB=(sat*B); }