55 lines
2.2 KiB
C++
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();
|
|
}
|