portfolio/aquarium/obstacle.cpp
thierry_nibert 5b6730b2dc add files
2026-08-01 16:49:57 +02:00

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);
}
}