Vector tousLesTrajets; Vector trajet; Mobile mobile0,mobile1,mobile2; float cc=cos(0.01f); float sc=sin(0.01f); BGraphics buffer; boolean go,trajetclos,sanstrace,boutonrelache; int rouge,bleu ,vert,incrouge,incbleu,incvert; Bouton button0,button1,button2,button3; BFont gille; void setup(){ size(700,500); gille= loadFont("GillSans.vlw.gz"); textFont(gille,20); sanstrace=true; background(0,0,85); trajetclos=true;boutonrelache=false; tousLesTrajets=new Vector(); trajet=new Vector(); trajet.add(new Vecteur(100.0f,200.0f,0)); trajet.add(new Vecteur(500.0f,200.0f,0)); trajet.add(new Vecteur(300.0f,200.0f,0)); trajet.add(new Vecteur(500.0f,100.0f,0)); trajet.add(new Vecteur(300.0f,200.0f,0)); trajet.add(new Vecteur(500.0f,300.0f,0)); tousLesTrajets.add(0,trajet); vert=120;bleu=180;rouge=120;incrouge=3;incvert=2;incbleu=-3; mobile0=new Mobile(new Vecteur(115,200,0),new Vecteur(110,200,0),-1,0); mobile1=new Mobile(new Vecteur(210,200,0),new Vecteur(215,200,0),1,1); mobile2=new Mobile(new Vecteur(310,200,0),new Vecteur(315,200,0),-1,2); buffer = new BGraphics(700,430); buffer.background(255,0,0); buffer.strokeWeight(2.0f); buffer.stroke(0); buffer.line(100.0f,200.0f,500.0f,200.0f); buffer.line(300.0f,200.0f,500.0f,100.0f); buffer.line(300.0f,200.0f,500.0f,300.0f); go=true; ellipseMode(CENTER_DIAMETER); button0=new Bouton(190,470,40,20," droite","gauche",mobile0.sens,0xbb5555); button1=new Bouton(290,470,40,20," droite","gauche",mobile1.sens,0x5555bb); button2=new Bouton(390,470,40,20," droite","gauche",mobile2.sens,0x55bb55); button3=new Bouton(490,470,40,20," sans trace","trace",-1,0x999900); } void loop(){ if(sanstrace)background(0,0,85); if(mousePressed && mouseY<421){ float mx=this.constrain(mouseX,10,690); float my=this.constrain(mouseY,10,420); if(trajetclos){trajetclos=false; trajet=new Vector(); trajet.add(new Vecteur(mx,my,0)); tousLesTrajets.add(trajet);//println(tousLesTrajets.size()); }else{ Vecteur dernier=(Vecteur)trajet.lastElement(); if(distance2(dernier.x,dernier.y,mx,my)>9){ buffer.line(Math.round(dernier.x),Math.round(dernier.y),mx,my); trajet.add(new Vecteur(mx,my,0));} } } tracerTrajet(); if(go){calculer(mobile0);calculer(mobile1);calculer(mobile2);} fill(240); rect(0,430,700,80); mobile0.sens=button0.actualiser(); mobile1.sens=button1.actualiser(); mobile2.sens=button2.actualiser(); sanstrace= (button3.actualiser()<0); } void mouseReleased(){ trajetclos=true;boutonrelache=true; } void tracerTrajet(){ if(sanstrace){ this.strokeWeight(8.0f); Vecteur v0=mobile0.calculNormal(); Vecteur v2=mobile2.calculNormal(); Vecteur v1=mobile1.calculNormal(); stroke(185,0,0); line(mobile0.deux.x,mobile0.deux.y,mobile0.deux.x+v0.x,mobile0.deux.y+v0.y); stroke(0,0,180); line(mobile1.deux.x,mobile1.deux.y,mobile1.deux.x+v1.x,mobile1.deux.y+v1.y); stroke(0,185,0); line(mobile2.deux.x,mobile2.deux.y,mobile2.deux.x+v2.x,mobile2.deux.y+v2.y);} changecouleur();fill(255); stroke(rouge,vert,bleu); this.strokeWeight(2.0f); float x0=mobile0.deux.x;float y0=mobile0.deux.y; float x1=mobile1.deux.x;float y1=mobile1.deux.y; float x2=mobile2.deux.x;float y2=mobile2.deux.y; bezier(x0,y0,x1,y1,x2,y2,x1,y1); bezier(x1,y1,x0,y0,x2,y2,x0,y0); bezier(x0,y0,x2,y2,x1,y1,x2,y2); stroke(255);this.strokeWeight(1.0f); if(!tousLesTrajets.isEmpty()){ for(int i=0;i250||rouge<105)incrouge*=-1; vert+=incvert; if(vert>240||vert<105)incvert*=-1; bleu+=incbleu; if(bleu>250||bleu<105)incbleu*=-1; } //------------------------------------------------------- //------------------------------------------------------- public class Bouton { int x,y,l,h,sens,c,c0,cd,cg; float r,g,b,r0,g0,b0; String texte,texte0,texte1; BApplet gra; boolean sur; public Bouton(int x,int y, int l,int h,String texte0,String texte1,int sens,int couleur){ this.x=x; this.y=y; this.l=l; this.h=h; this.texte0= texte0; this.texte1= texte1; this.texte=texte0; this.sens=sens; this.c=couleur; this.c0=0x887777; this.cg=c0; this.cd=c; this.sur=false; } int actualiser(){ sur=((mouseX>x)&&(mouseXy)&&(mouseY0) {sens=-1;texte=texte0;cg=c0;cd=c;} else {sens=1;texte=texte1;cg=c;cd=c0;} boutonrelache=false; } dessin(); return sens; } void dessin(){ float d=l/2; fill(red(cg),green(cg),blue(cg)); rect(x,y,d,h); fill(red(cd),green(cd),blue(cd)); rect(x+d,y,d,h); text(texte,x,y+h/2-15); } } //------------------------------------------------------- //------------------------------------------------------- public class Mobile { Vecteur un,deux; int numero,sens; public Mobile(Vecteur un,Vecteur deux,int sens,int numero){ this.un=un; this.deux=deux; this.numero=numero; this.sens=sens; } Vecteur calculNormal(){ float cx=-un.y+deux.y; float cy=-deux.x+un.x; return new Vecteur(3.0f*cx*sens,3.0f*cy*sens,0); } } //------------------------------------------------------- //------------------------------------------------------- static class Vecteur { float x, y, z; Vecteur() { } Vecteur(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } Vecteur(float x, float y, float z,float lon) { float no=(float) Math.sqrt(x * x + y * y + z * z); no=lon/no; this.x = x*no; this.y = y*no; this.z = z*no; } void place(float xx, float yy, float zz) { this.x = xx; this.y = yy; this.z = zz; } Vecteur normalize() { float length = length(); x /= length; y /= length; z /= length; return this; } Vecteur normalize(float k) { float length = length(); x=x/ length*k; y =y/ length*k; z =z/ length*k; return this; } float length() { return (float) Math.sqrt(x * x + y * y + z * z); } Vecteur cross(Vecteur v2) { Vecteur res = new Vecteur(); res.x = y * v2.z - z * v2.y; res.y =z * v2.x - x * v2.z; res.z = x * v2.y - y * v2.x; return res; } static float dot(Vecteur v1, Vecteur v2) { return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; } float dot(Vecteur v1) { return v1.x * x + v1.y *y + v1.z *z; } Vecteur mul( float d) { Vecteur res = new Vecteur(); res.x =x * d; res.y = y * d; res.z = z * d; return res; } static Vecteur comb(float a,Vecteur v1,float b, Vecteur v2) { float rx =a* v1.x + b*v2.x; float ry =a* v1.y + b*v2.y; float rz =a* v1.z + b*v2.z; return new Vecteur(rx,ry,rz); } Vecteur ajouter(Vecteur v,float m){ Vecteur res=new Vecteur(x+v.x*m, y+v.y*m,z+v.z*m); return res; } void afficher(String tex,BApplet ba){ ba.println(tex+"x= "+x+" y= "+y+" z= "+z); } Vecteur projete(Vecteur laxe){ laxe.normalize(); Vecteur res=laxe.mul(this.dot(laxe)); return res; } Vecteur projeteSurAxe(Vecteur laxe){ laxe.normalize(); Vecteur res=laxe.mul(this.dot(laxe)); return res; } Vecteur projeteSurPlan(Vecteur laxe){ laxe.normalize(); Vecteur res=laxe.mul(this.dot(laxe)); res=this.ajouter(projeteSurAxe(res),-1); return res; } Vecteur projeteSurPlan(Vecteur laxe,Vecteur unpoint){ laxe.normalize(); Vecteur res=projeteSurPlan(laxe); return res.ajouter(unpoint.projeteSurAxe(res),1); } float donneAngle(Vecteur vc){ return (float) Math.acos(this.dot(vc)/(length()*vc.length())); } Vecteur tourner(Vecteur axe,float angle){//axe est normé et orthogonal à this Vecteur vaxe=axe.mul(this.dot(axe)); Vecteur vx=this.ajouter(vaxe,-1); Vecteur ygrec=axe.cross(this); return vaxe.ajouter(Vecteur.comb((float)Math.cos(angle),this,(float)Math.sin(angle),ygrec),1); } Vecteur cloner() { Vecteur res = new Vecteur(); res.x =x ; res.y = y ; res.z = z ; return res; } }