Création d'un compte pour un collaborateur extérieur au laboratoire depuis l'intranet ICube : https://intranet.icube.unistra.fr/fr/labs/member/profile

Commit 2f6b2047 authored by Jund Thomas's avatar Jund Thomas
Browse files

merging conflicts

parents fb0ef620 70a6de52
......@@ -4,7 +4,7 @@ project(SocialAgents)
#add_definitions(-DSPATIAL_HASHING)
SET(CGoGN_ROOT_DIR ${CMAKE_SOURCE_DIR}/../CGoGN CACHE STRING "CGoGN root dir")
SET(CGoGN_ROOT_DIR ${CMAKE_SOURCE_DIR}/../../CGoGN CACHE STRING "CGoGN root dir")
include(${CGoGN_ROOT_DIR}/apps_cmake.txt)
add_subdirectory(${CMAKE_SOURCE_DIR}/Release Release)
......
......@@ -37,10 +37,12 @@ struct PFP : public PFP_STANDARD
// definition des listes d'agent
typedef std::vector<Agent*> AGENTS ;
typedef std::vector<Obstacle*> OBSTACLES ;
typedef std::vector<MovingObstacle*> MOVINGOBSTACLES;
typedef NoMathIONameAttribute<AGENTS> AGENTVECT ;
typedef NoMathIONameAttribute<OBSTACLES> OBSTACLEVECT ;
typedef NoMathIONameAttribute<MOVINGOBSTACLES> MOVINGOBSTACLEVECT;
typedef VertexAttribute<PFP::VEC3> TVEC3;
......@@ -194,7 +196,7 @@ void update_registration(Obstacle * o);
void register_pop(Obstacle* o, int n);
void resetObstInFace(Obstacle* o);
void resetObstPartInFace(Obstacle* o, Dart d);
void resetPart(MovingObstacle * mo, Dart d);
void resetPart(MovingObstacle * mo,int index, Dart d);
void displayMO(Obstacle * o);
/**************************************
......
......@@ -232,16 +232,21 @@ void Agent::obstacle_priority(PFP::VEC3 * goalVector)
vec=y-x ;
vec.normalize() ;
norm.zero() ;
if (sim_->avoidance==1)// avoids with normal of obstacle side
if (sim_->avoidance==0)// avoids with normal of obstacle side
{
norm[0]=vec[1] ;
norm[1]=-vec[0] ;
}
else if (sim_->avoidance==0) // avoids along the obstacle side
else if (sim_->avoidance==1) // avoids with direction from center of the obstacle
{
norm[0]=(3.0f*vec[1]+vec[0])/4.0f ;
norm[1]=(vec[1]-3.0f*vec[0])/4.0f ;
MovingObstacle * mo = obst->mo;
norm = this->part_.getPosition()-mo->center;
}
// else if (sim_->avoidance==2) // avoids with opposite direction of obstacle
// {
// MovingObstacle * mo = obst->mo;
// norm = this->part_.getPosition()-mo->center;
// }
norm.normalize() ;
norm*=5.0f*factor*factor*factor*factor*factor*factor*factor*factor ;
sumNorm+=norm ;
......
......@@ -514,8 +514,8 @@ void EnvMap::updateMap()
popAgentInCells(*ait, old) ;
for (PFP::OBSTACLEVECT::iterator ait = oldObst.begin(); ait != oldObst.end(); ++ait)
register_pop(*ait, (*ait)->index) ;
for (PFP::OBSTACLEVECT::iterator ait = oldNeighborObst.begin();
ait != oldNeighborObst.end(); ++ait)
for (PFP::OBSTACLEVECT::iterator ait = oldNeighborObst.begin(); ait != oldNeighborObst.end(); ++ait)
register_pop(*ait, (*ait)->index) ;
neighborAgentvect[old].clear() ;
......@@ -613,98 +613,270 @@ void EnvMap::updateMap()
// On recrée une liste des faces à simplifier en empêchant les doublons
// On en profite pour vérifier les conditions de simplifications
std::vector<Dart> checkCoarsenCandidate ;
checkCoarsenCandidate.reserve(coarsenCandidate.size()) ;
for (unsigned int it = 0; it < coarsenCandidate.size(); ++it)
{
Dart old = coarsenCandidate[it] ;
bool oldIsMarked = coarsenMark.isMarked(old) ;
coarsenMark.unmark(old) ;
unsigned int fLevel = map.faceLevel(old) ;
if (oldIsMarked && fLevel > 0 && map.getDartLevel(old) < fLevel)
{
unsigned int cur = map.getCurrentLevel() ;
map.setCurrentLevel(fLevel - 1) ;
if (map.faceIsSubdividedOnce(old))
{
// on compte le nombre d'agents dans les sous-faces
// on en profite pour compter le degré de la face grossière
unsigned int degree = 0 ;
unsigned int nbAgents = 0 ;
Dart fit = old ;
do
{
nbAgents += agentvect[fit].size() ;
++degree ;
coarsenMark.unmark(fit) ;
// TODO Optimisation déjà faite
// unsigned int start = it + 1;
// unsigned int fEmb = map.getEmbedding<FACE>(fit) ;
// while(start < coarsenCandidate.size())
// std::vector<Dart> checkCoarsenCandidate ;
// checkCoarsenCandidate.reserve(coarsenCandidate.size()) ;
//
// for (unsigned int it = 0; it < coarsenCandidate.size(); ++it)
// {
// Dart old = coarsenCandidate[it] ;
// bool oldIsMarked = coarsenMark.isMarked(old) ;
// coarsenMark.unmark(old) ;
//
// unsigned int fLevel = map.faceLevel(old) ;
//
// if (oldIsMarked && fLevel > 0 && map.getDartLevel(old) < fLevel)
// {
// unsigned int cur = map.getCurrentLevel() ;
// map.setCurrentLevel(fLevel - 1) ;
//
// if (map.faceIsSubdividedOnce(old))
// {
// // on compte le nombre d'agents dans les sous-faces
// // on en profite pour compter le degré de la face grossière
// unsigned int degree = 0 ;
// unsigned int nbAgents = 0 ;
// Dart fit = old ;
// do
// {
// nbAgents += agentvect[fit].size() ;
// ++degree ;
// coarsenMark.unmark(fit) ;
//// TODO Optimisation déjà faite
//// unsigned int start = it + 1;
//// unsigned int fEmb = map.getEmbedding<FACE>(fit) ;
//// while(start < coarsenCandidate.size())
//// {
//// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
//// {
//// coarsenCandidate[start] = coarsenCandidate.back() ;
//// coarsenCandidate.pop_back() ;
//// }
//// else
//// ++start ;
//// }
//
// fit = map.phi1(fit) ;
// } while (fit != old) ;
//
//
// //Loop subdivision
// if (degree == 3)
// {
// map.setCurrentLevel(fLevel) ;
// Dart centerFace = map.phi2(map.phi1(old)) ;
// nbAgents += agentvect[centerFace].size() ;
// coarsenMark.unmark(centerFace) ;
//// TODO Optimisation déjà faite
//// unsigned int start = it + 1;
//// unsigned int fEmb = map.getEmbedding<FACE>(centerFace) ;
//// while(start < coarsenCandidate.size())
//// {
//// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
//// {
//// coarsenCandidate[start] = coarsenCandidate.back() ;
//// coarsenCandidate.pop_back() ;
//// }
//// else
//// ++start ;
//// }
// map.setCurrentLevel(fLevel - 1) ;
// }
// if (nbAgents < nbAgentsToSimplify) checkCoarsenCandidate.push_back(old) ;
// }
// map.setCurrentLevel(cur) ;
// }
// }
// coarsenCandidate.clear() ;
//
// // On réalise la simplification (les conditions ont déjà été vérifiées)
// for (unsigned int it = 0; it < checkCoarsenCandidate.size(); ++it)
// {
// Dart old = checkCoarsenCandidate[it] ;
//
// unsigned int fLevel = map.faceLevel(old) ;
// unsigned int cur = map.getCurrentLevel() ;
// map.setCurrentLevel(fLevel - 1) ;
//
// // on compte le degré de la face grossière
// unsigned int degree = 0 ;
// Dart fit = old ;
// do
// {
// ++degree ;
// fit = map.phi1(fit) ;
// } while (fit != old) ;
//
// PFP::AGENTS agents ;
// PFP::OBSTACLEVECT obst ;
// PFP::OBSTACLEVECT neighborObst ;
//
// fit = old ;
// do
// {
// PFP::AGENTS a(agentvect[fit]) ;
// PFP::OBSTACLEVECT ob(obstvect[fit]) ;
// PFP::OBSTACLEVECT nob(neighborObstvect[fit]) ;
//
// agents.insert(agents.end(), a.begin(), a.end()) ;
// obst.insert(obst.end(), ob.begin(), ob.end()) ;
// neighborObst.insert(neighborObst.end(), nob.begin(), nob.end()) ;
// map.setCurrentLevel(map.getMaxLevel()) ;
// for (PFP::AGENTS::iterator ait = a.begin(); ait != a.end(); ++ait)
// popAgentInCells(*ait, fit) ;
// map.setCurrentLevel(fLevel - 1) ;
// Dart nf = map.phi2(fit) ;
// if (!map.faceIsSubdivided(nf))
// {
// map.setCurrentLevel(fLevel) ;
// PFP::AGENTS& an = agentvect[nf] ;
// PFP::OBSTACLEVECT resetob = obstvect[nf] ;
// for (PFP::AGENTS::iterator ait = an.begin(); ait != an.end(); ++ait)
// {
// if ((*ait)->part_.d == map.phi1(nf)) (*ait)->part_.d = nf ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = resetob.begin(); ait != resetob.end(); ++ait)
// {
// MovingObstacle* mo = (*ait)->mo ;
// if (mo != NULL)
// {
// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
// {
// coarsenCandidate[start] = coarsenCandidate.back() ;
// coarsenCandidate.pop_back() ;
// }
// else
// ++start ;
// resetPart(mo,(*ait)->index, nf) ;
// }
// }
// map.setCurrentLevel(fLevel - 1) ;
// }
// fit = map.phi1(fit) ;
// } while (fit != old) ;
//
// if (degree == 3)
// {
// map.setCurrentLevel(fLevel) ;
// Dart centerFace = map.phi2(map.phi1(old)) ;
// PFP::AGENTS a(agentvect[centerFace]) ;
// PFP::OBSTACLEVECT ob(obstvect[centerFace]) ;
// PFP::OBSTACLEVECT nob(neighborObstvect[centerFace]) ;
// agents.insert(agents.end(), a.begin(), a.end()) ;
// obst.insert(obst.end(), ob.begin(), ob.end()) ;
// neighborObst.insert(neighborObst.end(), nob.begin(), nob.end()) ;
// map.setCurrentLevel(map.getMaxLevel()) ;
// for (PFP::AGENTS::iterator ait = a.begin(); ait != a.end(); ++ait)
// popAgentInCells(*ait, centerFace) ;
// map.setCurrentLevel(fLevel - 1) ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
// {
// removeElementFromVector<Obstacle*>(neighborObst, (*ait)) ;
// }
// neighborAgentvect[old].clear() ;
// // TODO Check with optimisation
// map.setCurrentLevel(map.getMaxLevel()) ;
// for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
// register_pop(*ait, (*ait)->index) ;
// for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
// register_pop(*ait, (*ait)->index) ;
// map.setCurrentLevel(fLevel - 1) ;
//
// Algo::IHM::coarsenFace<PFP>(map, old, position) ;
//
// std::pair<bool, bool>& sf = subdivisableFace[old] ;
// sf.first = true ;
// sf.second = true ;
//
// map.setCurrentLevel(map.getMaxLevel()) ;
//
// for (PFP::AGENTS::iterator itA = agents.begin(); itA != agents.end(); ++itA)
// {
// (*itA)->part_.d = old ;
// pushAgentInCells(*itA, old) ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
// {
// resetObstPartInFace(*ait, old) ;
// update_registration(*ait) ;
// }
// for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
// {
// update_registration(*ait) ;
// }
//
// Dart dd = old ;
// do
// {
// Dart ddd = map.alpha1(map.alpha1(dd)) ;
// while (ddd != dd)
// {
// neighborAgentvect[old].insert(neighborAgentvect[old].end(), agentvect[ddd].begin(), agentvect[ddd].end()) ;
// ddd = map.alpha1(ddd) ;
// }
// dd = map.phi1(dd) ;
// } while (dd != old) ;
//
// if (fLevel > 1 && !coarsenMark.isMarked(old) && agentvect[old].size() < nbAgentsToSimplify)
// {
// coarsenMark.mark(old) ;
// coarsenCandidate.push_back(map.faceOldestDart(old)) ;
// }
//
// map.setCurrentLevel(cur) ;
// }
// map.setCurrentLevel(map.getMaxLevel()) ;
// if (coarsenCandidate.size() > 0) updateMap() ;
}
fit = map.phi1(fit) ;
} while (fit != old) ;
void EnvMap::resetAgentInFace(Agent* agent)
{
VEC3 pos = agent->part_.getPosition() ;
agent->part_.move(Algo::Geometry::faceCentroid<PFP>(map, agent->part_.d, position)) ;
agent->part_.setState(FACE) ;
agent->part_.move(pos) ;
}
#endif
#ifdef SPATIAL_HASHING
Geom::Vec2ui EnvMap::agentPositionCell(Agent* a)
{
VEC3 relativePos = a->pos - geometry.min() ;
relativePos /= minCellSize ;
return Geom::Vec2ui(relativePos[0], relativePos[1]) ;
}
//Loop subdivision
if (degree == 3)
{
map.setCurrentLevel(fLevel) ;
Dart centerFace = map.phi2(map.phi1(old)) ;
nbAgents += agentvect[centerFace].size() ;
coarsenMark.unmark(centerFace) ;
// TODO Optimisation déjà faite
// unsigned int start = it + 1;
// unsigned int fEmb = map.getEmbedding<FACE>(centerFace) ;
// while(start < coarsenCandidate.size())
// {
// if(map.getEmbedding<FACE>(coarsenCandidate[start]) == fEmb)
// {
// coarsenCandidate[start] = coarsenCandidate.back() ;
// coarsenCandidate.pop_back() ;
// }
// else
// ++start ;
// }
map.setCurrentLevel(fLevel - 1) ;
}
if (nbAgents < nbAgentsToSimplify) checkCoarsenCandidate.push_back(old) ;
const std::vector<Agent*>& EnvMap::getNeighbors(Agent* a)
{
Geom::Vec2ui c = agentPositionCell(a) ;
return ht_agents[c] ;
}
const std::vector<Agent*>& EnvMap::getNeighborAgents(Agent* a)
{
Geom::Vec2ui c = agentPositionCell(a) ;
return ht_neighbor_agents[c] ;
}
void EnvMap::getOneRingNeighbors(Agent* a, std::vector<Agent*>& neighbors)
{
Geom::Vec2ui c = agentPositionCell(a) ;
for(int ii = -1 ; ii <= 1 ; ++ii)
{
for(int jj = -1 ; jj <= 1 ; ++jj)
{
if (ii != 0 || jj != 0)
{
Geom::Vec2ui cc = c + Geom::Vec2ui(ii, jj) ;
const std::vector<Agent*>& v = ht_agents[cc] ;
neighbors.insert(neighbors.end(), v.begin(), v.end()) ;
}
map.setCurrentLevel(cur) ;
}
}
coarsenCandidate.clear() ;
// On réalise la simplification (les conditions ont déjà été vérifiées)
for (unsigned int it = 0; it < checkCoarsenCandidate.size(); ++it)
{
Dart old = checkCoarsenCandidate[it] ;
}
unsigned int fLevel = map.faceLevel(old) ;
unsigned int cur = map.getCurrentLevel() ;
map.setCurrentLevel(fLevel - 1) ;
void EnvMap::addAgentInGrid(Agent* a)
{
Geom::Vec2ui c = agentPositionCell(a) ;
addAgentInGrid(a,c) ;
}
// on compte le degré de la face grossière
unsigned int degree = 0 ;
Dart fit = old ;
do
{
++degree ;
fit = map.phi1(fit) ;
} while (fit != old) ;
void EnvMap::addAgentInGrid(Agent* a, Geom::Vec2ui c)
{
ht_agents[c].push_back(a) ;
PFP::AGENTS agents ;
PFP::OBSTACLEVECT obst ;
......@@ -777,53 +949,30 @@ void EnvMap::updateMap()
sf.first = true ;
sf.second = true ;
map.setCurrentLevel(map.getMaxLevel()) ;
void EnvMap::removeAgentFromGrid(Agent* a)
{
Geom::Vec2ui c = agentPositionCell(a) ;
removeAgentFromGrid(a,c) ;
}
for (PFP::AGENTS::iterator itA = agents.begin(); itA != agents.end(); ++itA)
{
(*itA)->part_.d = old ;
pushAgentInCells(*itA, old) ;
}
for (PFP::OBSTACLEVECT::iterator ait = obst.begin(); ait != obst.end(); ++ait)
{
resetObstPartInFace(*ait, old) ;
update_registration(*ait) ;
}
for (PFP::OBSTACLEVECT::iterator ait = neighborObst.begin(); ait != neighborObst.end(); ++ait)
{
update_registration(*ait) ;
}
Dart dd = old ;
do
void EnvMap::removeAgentFromGrid(Agent* a, Geom::Vec2ui c)
{
removeElementFromVector<Agent*>(ht_agents[c], a) ;
if (ht_agents[c].empty()) ht_agents.erase(c) ;
for(int ii = -1; ii <= 1; ++ii)
{
for(int jj = -1; jj <= 1; ++jj)
{
Dart ddd = map.alpha1(map.alpha1(dd)) ;
while (ddd != dd)
if(!(ii == 0 && jj == 0))
{
neighborAgentvect[old].insert(neighborAgentvect[old].end(), agentvect[ddd].begin(), agentvect[ddd].end()) ;
ddd = map.alpha1(ddd) ;
Geom::Vec2ui cc = c + Geom::Vec2ui(ii, jj) ;
removeElementFromVector<Agent*>(ht_neighbor_agents[cc], a) ;
if (ht_neighbor_agents[c].empty()) ht_neighbor_agents.erase(c) ;
}
dd = map.phi1(dd) ;
} while (dd != old) ;
if (fLevel > 1 && !coarsenMark.isMarked(old) && agentvect[old].size() < nbAgentsToSimplify)
{
coarsenMark.mark(old) ;
coarsenCandidate.push_back(map.faceOldestDart(old)) ;
}
map.setCurrentLevel(cur) ;
}
map.setCurrentLevel(map.getMaxLevel()) ;
if (coarsenCandidate.size() > 0) updateMap() ;
}
void EnvMap::resetAgentInFace(Agent* agent)
{
VEC3 pos = agent->part_.getPosition() ;
agent->part_.move(Algo::Geometry::faceCentroid<PFP>(map, agent->part_.d, position)) ;
agent->part_.setState(FACE) ;
agent->part_.move(pos) ;
}
#endif
......
......@@ -73,7 +73,6 @@ MovingObstacle::MovingObstacle(Simulator* sim, int ind, std::vector<VEC3> pos, V
movingObstNeighbors_.reserve(maxNeighbors_);
rot = rota;
VEC3 sum = 0;
nb_agents_voisins = 0;
nb_register_cells = 0;
......@@ -239,7 +238,6 @@ void MovingObstacle::computePrefVelocity()
// goalVector.normalize();
//
// prefVelocity_=goalVector;
}
// TODO Check position
......@@ -440,7 +438,7 @@ void MovingObstacle::register_update(Obstacle* o, Dart d, int n)
std::list<Dart> memo;
bool modif=false;
// bool modif=false;
// if(p1->crossCell != CGoGN::Algo::MovingObjects::NO_CROSS
// || p2->crossCell != CGoGN::Algo::MovingObjects::NO_CROSS)
......@@ -523,13 +521,13 @@ void resetObstPartInFace(Obstacle* o, Dart d1)
}
}
void resetPart(MovingObstacle * mo, Dart d1)
void resetPart(MovingObstacle * mo,int index, Dart d1)
{
int i = index;
if (mo->parts_[i]->d == mo->sim_->envMap_.map.phi1(d1))
mo->parts_[i]->d = d1;
for (unsigned int i = 0; i < mo->nbVertices; i++) {
if (mo->parts_[i]->d == mo->sim_->envMap_.map.phi1(d1))
mo->parts_[i]->d = d1;
}
}
void displayMO(Obstacle * o)
......
......@@ -10,7 +10,7 @@ Simulator::Simulator(int minSize) :
nbCoarsenCandidate(0),
nearNeighbors(0),
totalNeighbors(0),
avoidance(0),
avoidance(1),
nb_dead(0)
{
srand(10) ;
......@@ -82,7 +82,7 @@ void Simulator::doStep()
{
#ifndef SPATIAL_HASHING
envMap_.clearUpdateCandidates() ;
envMap_.map.setCurrentLevel(0) ;
envMap_.map.setCurrentLevel(envMap_.map.getMaxLevel()) ;
#endif
for (unsigned int i = 0 ; i < movingObstacles_.size() ; ++i)
......@@ -94,15 +94,7 @@ void Simulator::doStep()
for (unsigned int i = 0 ; i < agents_.size() ; ++i)
{
agents_[i]->updateObstacleNeighbors() ;
#ifndef SPATIAL_HASHING
envMap_.map.setCurrentLevel(envMap_.map.getMaxLevel()) ;
#endif
agents_[i]->updateAgentNeighbors() ;
#ifndef SPATIAL_HASHING
envMap_.map.setCurrentLevel(0) ;
#endif
agents_[i]->computePrefVelocity() ;
agents_[i]->computeNewVelocity() ;
}
......@@ -148,7 +140,8 @@ void Simulator::doStep()
nbRefineCandidate += envMap_.refineCandidate.size() ;
nbCoarsenCandidate += envMap_.coarsenCandidate.size() ;
// envMap_.updateMap() ;
envMap_.updateMap() ;
#endif
globalTime_ += timeStep_ ;
......@@ -307,19 +300,19 @@ void Simulator::setupCorridorScenario(unsigned int nbAgents, unsigned int nbObst
//for generating a random path
unsigned int dartDistForPath = 50 ;
mo4->goals_.clear() ;
Dart dStart = mo4->parts_[0]->d;
Dart dStop = dStart ;
for (unsigned int j = 0 ; envMap_.buildingMark.isMarked(dStop) || j < dartDistForPath + rand() * 20 || envMap_.map.sameFace(dStop, dStart) ; ++j)
{
envMap_.map.next(dStop) ;
if (dStop == envMap_.map.end())
dStop = envMap_.map.begin() ;
}
addPathToObstacle(mo4, dStart, dStop);
addPathToObstacle(mo4, dStop, dStart);
// unsigned int dartDistForPath = 50 ;
// mo4->goals_.clear() ;
// Dart dStart = mo4->parts_[0]->d;
// Dart dStop = dStart ;
// for (unsigned int j = 0 ; envMap_.buildingMark.isMarked(dStop) || j < dartDistForPath + rand() * 20 || envMap_.map.sameFace(dStop, dStart) ; ++j)
// {
// envMap_.map.next(dStop) ;
// if (dStop == envMap_.map.end())
// dStop = envMap_.map.begin() ;
// }
//
// addPathToObstacle(mo4, dStart, dStop);
// addPathToObstacle(mo4, dStop, dStart);
movingObstacles_.push_back(mo4);
}
......
......@@ -277,22 +277,22 @@ void SocialAgents::cb_redraw()
}
// affiche les cases de la map qui ont des obstacles
// glColor3f(1.0f, 0.5f, 0.5f);
// glLineWidth(5.0f);
// int nb =0;
// for(Dart d = sim.envMap_.map.begin(); d != sim.envMap_.map.end(); sim.envMap_.map.next(d))
// {
// for(std::vector<Obstacle*>::const_iterator it =sim.envMap_.obstvect[d].begin();it!=sim.envMap_.obstvect[d].end();++it)
// {
// if((*it)->mo!=NULL){
//