portfolio/cpp/aquarium/aquarium.cpp

101 lines
3.2 KiB
C++

#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; j<Obs.size();j++)
Obs[j]->anime(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<int> 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<nb_obs/2; i++)
Obs.push_back(new Obstacle( drand48() * rayon_max, point3D( drand48()* 3. + position.x, drand48() * 3. + position.y, drand48() * 3. + position.z)));
/* for(uint i=0; i<nb_obs/2; i++)
Enemis.push_back(new Predateur((drand48() %(rayon_max-3)),point3D( drand48()*10,drand48()%(rayon_max-3)/2,drand48() *20) ));
bancs.push_back(Banc());*/
}