float angleX,angleY,bangleX,bangleY,tempo,rayon,epais,cote,cost,sint; Polyedre licosaedre; Vecteur coul,origine1,origine2,axerot; // ++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++ void setup(){ size(750,500); tempo=0; rayon=2000; licosaedre=new Polyedre(rayon); coul=new Vecteur(0,0.6f,1.8f); origine1=new Vecteur(0,1800,-15000); origine2=new Vecteur(0,0,-15000); axerot=new Vecteur(1,0,1).normalize(); } // ++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++ void loop(){ clear();background(191,191,170); modifierparam(); Vecteur.afficherRepere(this,2000); box(12000); licosaedre.dessiner(licosaedre.patron,true); licosaedre.evoluer(); } // ++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++ void modifierparam(){ translate(origine1.x,origine1.y,origine1.z); bangleX=(mouseY)/50.0f; bangleY=(mouseX)/50.0f;// angleX+=(bangleX-angleX)/10.0f; angleY+=(bangleY-angleY)/10.0f; rotateX(-angleX); rotateY(angleY); } //++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++ void mousePressed(){ licosaedre=new Polyedre(rayon); } //++++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++ Vecteur vecteurNormal(Vecteur v1,Vecteur v2,Vecteur v3){ Vecteur w1=v2.ajouter(v1,-1); Vecteur w2=v3.ajouter(v1,-1); Vecteur res=(w1.cross(w2)); return res.normalize(); } // ++++++++++++++++++++++++++++++++++++++++ // CLASSE POLYEDRE // ++++++++++++++++++++++++++++++++++++++++ class Polyedre{ float r,angle,diedre,tempi; Vector patron,volume; boolean enmouvement; Vecteur axe; public Polyedre(float ray){ r=ray; patron=new Vector(); volume=new Vector(); diedre=(float)Math.acos(sqrt(5)/3); enmouvement=false; tempi=0; axe=new Vecteur(1,0,0); for(int i=0;i<4;i++){ patron.addElement( new Face( new Vecteur(0,0,0), new Vecteur(r*cos((i+1)*PI/3),0,r*sin((i+1)*PI/3)), new Vecteur(r*cos(i*PI/3),0,r*sin(i*PI/3))) ); } patron.addElement( new Face( new Vecteur(r*cos(5*PI/3),0,r*sin(5*PI/3)), new Vecteur(r*cos(4*PI/3),0,r*sin(4*PI/3)), new Vecteur(0,0,0) )); for(int i=0;i<5;i++){ patron.addElement( new Face( new Vecteur(r*cos(5*PI/3)+r*i,0,r*sin(5*PI/3)), new Vecteur(r*i,0,2*r*sin(5*PI/3)), new Vecteur(r*cos(4*PI/3)+r*i,0,r*sin(4*PI/3))) ); if(i<4)patron.addElement( new Face( new Vecteur(r*cos(5*PI/3)+r*i,0,r*sin(5*PI/3)), new Vecteur(r*i+r,0,2*r*sin(5*PI/3)), new Vecteur(r*i,0,2*r*sin(5*PI/3))) ); } patron.addElement(new Face( new Vecteur(5*r,0,2*r*sin(5*PI/3)), new Vecteur(4*r,0,2*r*sin(5*PI/3)), new Vecteur(r*4.5f,0,r*sin(5*PI/3))) ); for(int i=1;i>-4;i--){ patron.addElement( new Face( new Vecteur(4.5f*r+r*cos(i*PI/3), 0, 3*r*sin(5*PI/3)+r*sin(i*PI/3)), new Vecteur(4.5f*r, 0, 3*r*sin(5*PI/3)), new Vecteur(4.5f*r+r*cos((i+1)*PI/3), 0, 3*r*sin(5*PI/3)+r*sin((i+1)*PI/3))) ); } } // ++++++++++++++++++++++++++++++++++++++++ void dessiner(Vector desfaces,boolean bool){ if(bool){stroke(255);}else{noStroke();} for(int i=0;i0){ if(!enmouvement){ Face f=(Face)patron.remove(0); volume.add(0,f); angle=0; enmouvement=true; }else{ angle+=0.06; if(angle>diedre){ angle=diedre; enmouvement=false; } Face f0=(Face)volume.elementAt(0); for(int i=0;i 0.0f) ? (1.0f / (float) Math.sqrt(square)) : 1.0f; x *= dist; y *= dist; z *= dist; w *= dist; return this; } public Quat normalize(float c) { float square = x * x + y * y + z * z + w * w; float dist = (square > 0.0f) ? (c / (float) Math.sqrt(square)) : c; x *= dist; y *= dist; z *= dist; w *= dist; return this; } public static Quat mul(Quat q1, Quat q2) { Quat res = new Quat(); res.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; res.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y; res.y = q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z; res.z = q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x; return res; } public static Quat comb(Quat q1,float r1, Quat q2,float r2) { Quat res = new Quat(); res.w = q1.w *r1 + q2.w*r2; res.x = q1.x * r1+ q2.x * r2; res.y = q1.y * r1+ q2.y * r2; res.z = q1.z * r1+ q2.z * r2; return res; } public Quat ajouter(Quat q1,float r1) { Quat res = new Quat(); res.w = q1.w *r1; res.x = q1.x * r1; res.y = q1.y * r1; res.z = q1.z * r1; return res; } public float[] getValue() { float[] res = new float[4]; float nq=norme(); res[0] = (float) Math.acos(w/nq)* 2.0f; float nV= (float) Math.sqrt(x*x+y*y+z*z); if ( nV< 0.00001f*nq) { res[1] = x ; res[2] = y; res[3] = z ; }else{ res[1] = x /nV; res[2] = y/nV ; res[3] = z/nV; } return res; } public Quat conjugue(){ return new Quat(w,-x,-y,-z); } public Quat oppose(){ return new Quat(-w,-x,-y,-z); } public Quat copie(){ return new Quat(w,x,y,z); } public Quat copieNorme(){ Quat res=new Quat(w,x,y,z); res.normalize(); return res; } public Vecteur tourner(Vecteur v){ Quat qv=new Quat(0.0f,v.x,v.y,v.z); Quat qc=this.conjugue(); Quat q1=Quat.mul(qv,qc); Quat q= Quat.mul(this,q1); return new Vecteur(q.x,q.y,q.z); } public static Quat slerp(Quat d, Quat a,float t){ d.normalize(); a.normalize(); float angle=(float)Math.acos(d.x*a.x+d.y*a.y+d.z*a.z); float sina=(float)Math.sin(angle); float rd=(float)Math.sin(angle*(1-t))/sina; float ra=(float)Math.sin(angle*t)/sina; Quat res= Quat.comb(d,rd,a,ra); return res; } static Quat slerp1(Quat d, Quat a,float tt){ d.normalize(); a.normalize(); float t=(tt-1)*(tt-1)*(tt-1)+1; float angle=(float)Math.acos(d.x*a.x+d.y*a.y+d.z*a.z); float sina=(float)Math.sin(angle); float rd=(float)Math.sin(angle*(1-t))/sina; float ra=(float)Math.sin(angle*t)/sina; Quat res= Quat.comb(d,rd,a,ra); return res; } public Vecteur axe(){ return new Vecteur(x,y,z); } public static Quat euler2quat(float psi,float theta,float phi){ /* psi :angle de la rotation autour de 0z :precession * theta :angle de la rotation autour de 0x1 :nutation * phi :angle de la rotation autoue de 0z2 : rotation propre */ float w,x,y,z,th,psiMphi,psiPphi; th=theta/2; psiMphi=(psi-phi)/2; psiPphi=(psi+phi)/2; w=(float)Math.cos(th)*(float)Math.cos(psiPphi); x=(float)Math.sin(th)*(float)Math.cos(psiMphi); y=(float)Math.sin(th)*(float)Math.sin(psiMphi); z=(float)Math.cos(th)*(float)Math.sin(psiPphi); return new Quat(w,x,y,z); } }