101 lines
3.2 KiB
C++
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());*/
|
|
}
|