portfolio/cpp/aquarium/banc.cpp

55 lines
2.2 KiB
C++

#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<int> 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();
}