int compte; float angleX,angleY,bangleX,bangleY,tempo,rapport; float eloignement,largeur,hauteur,hautbord,pox,poy,poz; Articulation coude; Vector trajet0,trajet1; boolean bondebut,binitier; BFont lafonte; //******************************************* //******************************************* void setup(){ lafonte=loadFont("Slabserif-MediumItalic.vlw.gz"); size(750,500); angleX=0; angleY=0; tempo=0; trajet0=new Vector(); trajet1=new Vector(); bondebut=false; binitier=true; } void initier(){ binitier=false; trajet0.removeAllElements(); trajet1.removeAllElements(); compte=Math.round(random(5,7)); coude=new Articulation(compte); hautbord=20000f+30000*compte; eloignement=-200000-400000*compte; largeur=200000+10000*compte; hauteur=1000+9000*compte; } //******************************************* //******************************************* void loop(){ if(!bondebut){ background(230,180,255); fill(255); textFont(lafonte, 18); text(" clic... ",100,100); }else{ if(binitier==true)initier(); tempo+=0.02f; if(tempo>TWO_PI)tempo=tempo-TWO_PI; background(230+18.0f*cos(tempo),180,235+20.0f*sin(tempo)); dessinerTout();} } //******************************************* //******************************************* void modifierparam(){ bangleX=-0.4f+(-mouseY+100)/50.0f; bangleY=(mouseX-width/2.0f)/50.0f;// angleX+=(bangleX-angleX)/10.0f; angleY+=(bangleY-angleY)/10.0f; } void repere1(){ translate(200,0,eloignement); rotateX(angleX); rotateY(angleY); } //******************************************* void mousePressed(){binitier=true; bondebut=true;} //******************************************* void keyPressed(){ if (key=='+' )eloignement +=50000.0f; if(key=='-' )eloignement-=50000.0f; println("eloignement = "+eloignement+ " compte = "+compte); } //******************************************* void afficherRepere(float l){ stroke(255,0,0); line(0,0,0,l,0,0); stroke(0,255,0); line(0,0,0,0,l,0); stroke(0,0,255); line(0,0,0,0,0,l); } //******************************************* void dessinerTout(){ modifierparam(); if(coude.tempa<(6.4f)*compte){ push();//absolu repere1(); coude.appliquer(); float larg=(0.2f+1.8f*sq(cos(coude.tempa))) ; Vecteur w=coorabs(hauteur*larg,0,0); Vecteur w1=coorabs(hauteur*larg,largeur*larg*1.3f,0); pop();//absolu trajetAdd( w,w1); } repere1(); afficherTrajet(); } // +++++++++++++++++++++++++++++++++++ void afficherTrajet(){ Vecteur v0,v1,v,vp,vv,ww,no,coul; float cot=cos(tempo*2); float sit=sin(tempo*2); noStroke(); beginShape(QUAD_STRIP); for(int i=trajet0.size()-1;i>0;i--){ v0=(Vecteur)trajet0.elementAt(i-1); v=(Vecteur)trajet0.elementAt(i); vp=(Vecteur)trajet1.elementAt(i); vv=vp.ajouter(v,-1); ww=v.ajouter(v0,-1); no=(vv.cross(ww)).normalize(1.3f); coul=(new Vecteur(cot,2*sit*cot,1+2*cot*sit)).normalize(); float scal=255-255*(abs(Vecteur.dot(no,coul))); fill(150+0.4f*scal,100+0.3f*scal,150+0.4f*scal,160); if(i%2==0){ vertex(v.x,v.y,v.z); vertex(vp.x,vp.y,vp.z);} else{ vertex(vp.x,vp.y,vp.z); vertex(v.x,v.y,v.z); } } endShape(); beginShape(QUAD_STRIP); for(int i=trajet0.size()-1;i>0;i--){ v0=(Vecteur)trajet0.elementAt(i-1); v=(Vecteur)trajet0.elementAt(i); vp=(Vecteur)trajet1.elementAt(i); vv=vp.ajouter(v,-1); ww=v.ajouter(v0,-1); no=(vv.cross(ww)).normalize(3.7f); coul=(new Vecteur(cot,2*sit*cot,1+2*cot*sit)).normalize(); float scal=255-255*(abs(Vecteur.dot(no,coul))); fill(0.4f*scal+130,0.4f*scal+130,0.4f*scal+170,180); no=no.normalize(hautbord); if(i%2==0){ vertex(v.x,v.y,v.z); vertex(v.x+no.x,v.y+no.y,v.z+no.z);} else{ vertex(v.x+no.x,v.y+no.y,v.z+no.z); vertex(v.x,v.y,v.z); } } endShape(); } // ******************************************* // ******************************************* void trajetAdd(Vecteur w,Vecteur w1){ push(); rotateY(-angleY); rotateX(-angleX); translate(-200,0,-eloignement); w=coorabs(w.x,w.y,w.z); w1=coorabs(w1.x,w1.y,w1.z); pop(); trajet0.addElement(w); trajet1.addElement(w1); } Vecteur coorabs(float x,float y,float z) { float xa = objectX(x, y, z); float ya = objectY(x, y, z); float za = objectZ(x, y, z); return new Vecteur(xa, ya, za); } //++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++ class Articulation{ Vecteur pos; Vecteur XX,YY; int num; float tempa=0; Repere lerepere; public Articulation(int n){ num=n; Vecteur pos=new Vecteur(80000+random(0,30000),30000+random(0,20000),85000); Vecteur axex=(new Vecteur(random(-100,100),random(-100,100),random(-100,100))).normalize(); Vecteur axey; do {axey=(new Vecteur(random(-200,200),random(-200,200),random(-200,200))).normalize(); axey=axey.cross(axex);} while(axey.length()<0.001f); axey.normalize(); Vecteur axez=(axex.cross(axey)).normalize(); lerepere=new Repere(pos,axex,axey,axez); } public void appliquer(){ tempa+=0.04f; rotateX(tempa/num); for(int i=0;i