103 lines
4.8 KiB
C++
103 lines
4.8 KiB
C++
#include "obstacle.h"
|
|
#include "banc.h"
|
|
#include "math.h"
|
|
#include <qgl.h>
|
|
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<point3D> 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<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, (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);
|
|
}
|
|
}
|