#include "aquarium.h" #include "qgl.h" aquarium::aquarium(double rayon, point3D origine):Obstacle(rayon, origine) { rayon_max= rayon; position = origine; c[0]= .0; c[1]= .30; c[2]= 1., c[3] = 1.0; } void aquarium::anime(float temps) { // Enemis[0]->anime(temps, *Bancs[0]); for(uint i=0; i < Bancs.size();i++){ for(uint j= 0; janime(temps,*Bancs[i]); //Obstacle::anime(temps,*Bancs[i]); Bancs[i]->anime(temps); anime(*Bancs[i]); // } } void aquarium::anime(Banc &B) { //[1] les poissons voisins, au moyen de la méthode dans_voisinage() std::deque liste_voisin; double L=0.; for(uint j =0; j < B.banc_de_fish.size();j++) if(B.banc_de_fish[j]->dans_voisinage(position,1.+ (rayon_max *.35)/rayon_max)) liste_voisin.push_back(j); //[2] . Calcule du vecteur v1 correspondant à la séparation //[3] Calcule du vecteur vitesse v2 correspondant à l'alignement // la différence entre le vecteur vitesse actuel et la moyenne des vecteurs vitesse des poissons voisins. //[4] . Calculer un vecteur vitesse v3 correspondant à la cohésion : calculer la moyenne des // positions des poissons voisins (= centre de masse), le vecteur v3 est donné par la // différence entre ce centre de masse et la position du poisson considéré. point3D v1,v2,v3, v; for(uint j = 0; j< liste_voisin.size();j++){ v1 = v1 + B.banc_de_fish[liste_voisin[j]]->position; v2 = v2 + B.banc_de_fish[liste_voisin[j]]->vitesse; } if(liste_voisin.size()){ v1 = v1 /liste_voisin.size(); v2 = vitesse - v2/liste_voisin.size(); v3 = position - v1; v = v1 * 1.80 + v2 * 1.70 + v3 * 1.75; } if(liste_voisin.size()>0) L= 1./double(liste_voisin.size()); for(uint j = 0; j< liste_voisin.size();j++){ B.banc_de_fish[liste_voisin[j]]->vitesse = (B.banc_de_fish[liste_voisin[j]]->vitesse * (1-L) + v * (L)) ; point3D::normalize(B.banc_de_fish[liste_voisin[j]]->vitesse); } } void aquarium::affiche() { for(uint i=0; i< Obs.size();i++){ Obs[i]->affiche(); } /* for(uint i=0; i< Enemis.size();i++){ Enemis[i]->affiche(); } */ for(uint i=0; i< Bancs.size();i++){ glColor3d(drand48(),drand48(), drand48()); Bancs[i]->affiche(); } Obstacle::affiche(); } void aquarium::init(uint nb_obs) { /*cout<< rayon_max; if ((nb_obs<2)) nb_obs = 2; *///for(uint i=0; i<2; i++) { point3D vit = point3D(drand48() *5., drand48()* 2.5, drand48()* 5.); point3D::normalize(vit); Banc* b = new Banc(position, vit, 25., 0.95); Bancs.push_back(b); } //for(uint i=0; i