//Alcys_Extrusion 29/09/2004 ///////////////////////////////////////////////////////////////////////// BImage tampon; Vecteur der,deg,ded,mde,mge; boolean trajetclos,keyc; float angleX,angleY,butx,buty,reducteur,large,haut,coul1,coul2; int pas; Tirette curseur1,curseur2,regle1,regle2; BFont gille; ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// void setup(){ size(700, 560); background(20,0,66); reducteur=1/150000f; gille=loadFont("GillSans.vlw.gz"); pas=4; trajetclos=true;keyc=true; //definir les curseurs curseur1=new Tirette(150,350,100,5.0f,35.0f,"largeur",235,120,gille,this); curseur2=new Tirette(150,400,100,-126.0f,126.0f,"hauteur",235,120,gille,this); regle1=new Tirette(150,450,100,20.0f,253.0f,"couleur 1",235,120,gille,this); regle2=new Tirette(150,500,100,20.0f,253.0f,"couleur 2",235,120,gille,this); curseur1.setValeur(25f); curseur2.setValeur(90f); regle1.setValeur(20f); regle2.setValeur(200f); } ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// void loop() { clear(); actualiserCurseur(); actualiserTampon(); angleY+=0.05f; if(mousePressed ){ if(mouseX<300) {completerTrajet();}else{ modiferLesAngles(); }; } dessinerLextrusion(); } /////////////////////////////////////////////////////////////// void modiferLesAngles(){ butx=-(mouseY-height/2)*0.02f; buty=(mouseX-500)*0.02f; angleX+=(butx-angleX)/10.0f; angleY+=(buty-angleY)/10.0f; } //////////////////////////////////////////////////////////////// void dessinerLextrusion(){ noStroke(); translate(500, 200,-70); rotateX(angleX); rotateY(angleY); for(int i=0; i<290; i+=pas) { beginShape(TRIANGLE_STRIP); for(int j=0; j<290; j+=pas) { Vecteur v0=(new Vecteur(i-150,j,pixels[i+j*700]*reducteur)).coorabs(this); Vecteur v1=(new Vecteur(i-150,j+pas,pixels[i+(j+pas)*700]*reducteur)).coorabs(this); Vecteur v2=(new Vecteur(i-150+pas,j,pixels[i+pas+j*700]*reducteur)).coorabs(this); Vecteur vxv=((v1.ajouter(v0,-1)).cross(v2.ajouter(v0,-1))).normalize(); float correc=abs((1*vxv.x-1*vxv.y-0*vxv.z)/1.414f); fill(correc*coul1,0,coul2*(1.2f-correc)); vertex(i-150,j,(8355711-pixels[i+j*700])*reducteur); vertex(i-150+pas,j,(8355711-pixels[i+pas+j*700])*reducteur); } endShape(); } } //////////////////////////////////////////////////////////////// void mouseReleased(){ trajetclos=true; } //////////////////////////////////////////////////////////////// void keyPressed(){ if (key=='c')keyc=true; } //////////////////////////////////////////////////////////////// void actualiserTampon(){ if(keyc){ fill(127); noStroke(); rect(0,0,300,300); tampon=get(0,0,300,300); keyc=false; } set(0,0,tampon); } //////////////////////////////////////////////////////////////// void actualiserCurseur(){ curseur1.actualiser(); curseur2.actualiser(); regle1.actualiser(); regle2.actualiser(); coul1=regle1.getValeur(); coul2=regle2.getValeur(); large=curseur1.getValeur(); haut=curseur2.getValeur(); } //////////////////////////////////////////////////////////////// void completerTrajet(){ if(mouseY<300){ float mx=this.constrain(mouseX,10,300); float my=this.constrain(mouseY,10,300); if(trajetclos){trajetclos=false; der=new Vecteur(mx,my,0); deg=new Vecteur(mx+8,my,0); ded=new Vecteur(mx-8,my,0); mde=new Vecteur(mx-5,my,0); mge= new Vecteur(mx+5,my,0); }else{ if(distance2(der.x,der.y,mx,my)>9){ Vecteur nouv=new Vecteur(mx,my,0); Vecteur n=(new Vecteur(my-der.y,der.x-mx,0)).normalize(large); Vecteur nd=nouv.ajouter(n,1); Vecteur ng=nouv.ajouter(n,-1); Vecteur mds=nouv.ajouter(n,0.7f); Vecteur mgs=nouv.ajouter(n,-0.7f); noStroke(); beginShape(QUAD_STRIP); fill(127);vertex(ded.x,ded.y);vertex(nd.x,nd.y); fill(127+haut/6);vertex(mds.x,mds.y);vertex(mde.x,mde.y); fill(127+haut);vertex(der.x,der.y);vertex(nouv.x,nouv.y); fill(127+haut/6);vertex(mgs.x,mgs.y);vertex(mge.x,mge.y); fill(127);vertex(deg.x,deg.y);vertex(ng.x,ng.y); endShape(); der=nouv; mde=mds; mge=mgs; ded=nd; deg=ng; tampon=get(0,0,300,300); } } } } //////////////////////////////////////////////////////////////// float distance2(float x,float y,float a,float b){ return ((x-a)*(x-a)+(y-b)*(y-b)); } //********************************************************** //********************************************************** //********************************************************** //********************************************************** class Tirette { int x,y,xpos,xbut,longueur,couleur1,couleur2; float valmin,valmax,coef,valeur; String titre; boolean survol,drag; BFont lafonte; BApplet apple; //********************************************************** public Tirette(int x,int y,int longueur,float valmin ,float valmax,String titre,int couleur1,int couleur2,BFont lafont,BApplet apple){ this.x=x; this.y=y; this.xpos=x; this.xbut=x; this.survol=false; this.drag=false; this.longueur=longueur; this.valmin=valmin; this.valmax=valmax; this.coef=(valmax-valmin)/(2*longueur); this.titre=titre; this.valeur=(valmin+valmax)/2; this.couleur1=couleur1; this.couleur2=couleur2; this.lafonte=lafont; this.apple=apple; } //****************************************************** public void actualiser(){ if(!apple.mousePressed && drag) drag=false; survol= (apple.mouseX>xpos-10)&&(apple.mouseXy-10)&&(apple.mouseY