#include "banc.h" Banc::Banc(point3D p, point3D v, int nb_pesca, double coesion):nb_poisson(nb_pesca), L(coesion) { pos=p; vit = v; for(int i=0; i< nb_poisson;i++) banc_de_fish.push_back(new Poisson(point3D(p.x + drand48()*2., p.y + drand48()*2., p.z + drand48())*2., v)); } void Banc::anime(float temps){ for(uint i=0; i< banc_de_fish.size(); i++) { //[1] les poissons voisins, au moyen de la méthode dans_voisinage() std::deque liste_voisin; L=0.009; for(uint j =0; j < banc_de_fish.size();j++) if(j!=i) if(banc_de_fish[j]->dans_voisinage(banc_de_fish[i]->position, 1.5)) 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 + banc_de_fish[liste_voisin[j]]->position; v2 = v2 + banc_de_fish[liste_voisin[j]]->vitesse; } if(liste_voisin.size()){ v1 = v1 /liste_voisin.size(); v2 = vit - v2/liste_voisin.size(); v3 = banc_de_fish[i]->position - v1; v = v1 * 1.80 + v2 * 1.0 + v3 * 1.50; } if(liste_voisin.size() > 0 ) L= 1./liste_voisin.size(); //else L = .9; banc_de_fish[i]->vitesse = banc_de_fish[i]->vitesse * (1.- L) + v * L; point3D::normalize(banc_de_fish[i]->vitesse); banc_de_fish[i]->anime(temps); } } void Banc::affiche(){ for (uint i = 0; i < banc_de_fish.size();i++) banc_de_fish[i]->affiche(); }