#include "obstacle.h" #include "banc.h" #include "math.h" #include Obstacle::Obstacle(double Rayon, point3D origine) { rayon_max = Rayon; position = origine; nb_logitude= 20; pas_logitude=20.; nb_latitude=20; pas_latitude=20.; c=new double[4](); c[0]= .4; c[1]= .7; c[2]= .3, c[3] = .3; sphereGene(); } Obstacle::~Obstacle(){ delete c; } void Obstacle::sphereGene(){ // genératione de la map plan ou sphérique //a chaque l'atitude on stocks les point relativement aux logitude[0-180] maillage.clear(); for(double delta = 0; delta < 361; delta+=pas_logitude){ //int r = (delta*rayon_max)/180.;// rayon de la parrallele i deque ln, ls; for(double tetha = 0; tetha < 91; tetha += pas_latitude){ ln.push_back(point3D(rayon_max * sin(tetha*M_PI/180) *cosf(delta*M_PI/180),rayon_max * sin(tetha*M_PI/180) *sinf(delta*M_PI/180), rayon_max * cosf(tetha*M_PI/180))); ls.push_back(point3D(rayon_max * sin(tetha*M_PI/180) *cosf(delta*M_PI/180),rayon_max * sin(tetha*M_PI/180) * sinf(delta*M_PI/180), (-1.)*rayon_max * cosf(tetha*M_PI/180))); } if( delta != 0){ // ajout symetrique des paralléle maillage.push_front(ln); maillage.push_back(ls); } else maillage.push_back(ln); } } void Obstacle::affiche(){ glColor4dv(c); glBegin(GL_TRIANGLES); for(uint i = 1; i < maillage.size()-1; i++){ for(uint p = 1; p< maillage[i].size()-1; p++){ //demi quad 1 glVertex3d(maillage[i-1][p].x + position.x, maillage[i-1][p].y + position.y, maillage[i-1][p].z + position.z); glVertex3d(maillage[i][p].x + position.x, maillage[i][p].y + position.y, maillage[i][p].z + position.z); glVertex3d(maillage[i-1][p+1].x + position.x, maillage[i-1][p+1].y + position.y, maillage[i-1][p+1].z + position.z); //demie quad 2 glVertex3d(maillage[i][p].x + position.x, maillage[i][p].y + position.y, maillage[i][p].z+ position.z); glVertex3d(maillage[i][p+1].x + position.x, maillage[i][p+1].y, maillage[i][p+1].z+ position.z); glVertex3d(maillage[i-1][p+1].x + position.x, maillage[i-1][p+1].y+ position.y, maillage[i-1][p+1].z + position.z); } } for(uint p = 1; p< maillage[0].size()-1; p++){ //demi quad 1 glVertex3d(maillage[maillage.size()-1][p].x + position.x,maillage[maillage.size()-1][p].y + position.y,maillage[maillage.size()-1][p].z + position.z); glVertex3d(maillage[0][p].x + position.x,maillage[0][p].y + position.y,maillage[0][p].z + position.z); glVertex3d(maillage[maillage.size()-1][p+1].x + position.x,maillage[maillage.size()-1][p+1].y + position.y,maillage[maillage.size()-1][p+1].z + position.z); //demie quad 2 glVertex3d(maillage[0][p].x + position.x,maillage[0][p].y + position.y,maillage[0][p].z + position.z); glVertex3d(maillage[0][p+1].x + position.x,maillage[0][p+1].y + position.y,maillage[0][p+1].z + position.z); glVertex3d(maillage[maillage.size()-1][p+1].x + position.x,maillage[maillage.size()-1][p+1].y + position.y,maillage[maillage.size()-1][p+1].z + position.z); } glEnd(); } void Obstacle::anime(float temps, Banc& B){ //[1] les poissons voisins, au moyen de la méthode dans_voisinage() std::deque 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, (rayon_max*1.01)/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.50 + v2 * 1.0 + v3 * 1.50; } if(liste_voisin.size()) L= 1.- 1./double(liste_voisin.size()); else L = 1. - .99; 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); } }