Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 71f9f812 rédigé par Armand Lego's avatar Armand Lego
Parcourir les fichiers

Suppression de région avec vérification de connexité fonctionnelle

parent 3da490a8
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -5,7 +5,7 @@ Map::Map(unsigned int r, unsigned int c):
R(r), C(c)
{
//initialiser cellules
//Cration de toutes les cellules de la map
//Cr�ation de toutes les cellules de la map
for (unsigned int i = 0; i < R; i++)
{
map_cells.push_back({});
......@@ -14,7 +14,7 @@ Map::Map(unsigned int r, unsigned int c):
map_cells[i].push_back(Cell(i, j, nullptr));
}
}
//donner chaque cellule sa liste de voisins
//donner � chaque cellule sa liste de voisins
for (auto& r_it : map_cells)
{
......@@ -54,6 +54,7 @@ void Map::GenerateRegions() {
Cell* p = nullptr;
bool b = true;
std::set<Region*> regions;
while (b)
{
b = false;
......@@ -63,7 +64,7 @@ void Map::GenerateRegions() {
if (AdjCell)
{
auto AdjRegion = AdjCell->GetRegion();
if(regions.find(AdjRegion) == end(regions))
if (regions.find(AdjRegion) == end(regions))
{
regions.insert(AdjRegion);
b = true;
......@@ -75,39 +76,46 @@ void Map::GenerateRegions() {
}
regions.clear();
}
/*
std::for_each(begin(map_regions), end(map_regions), [](Region* r) {r->AddNeighbors(); });
for (auto& i : map_regions)
/* for (auto& i : map_regions)
{
std::for_each(begin(i->region_neighbors), end(i->region_neighbors), [](Region* i) { std::cout << i->id << ","; });
std::cout << i->id << " : ";
std::for_each(begin(i->GetNeighbors()), end(i->GetNeighbors()), [](Region* i) { std::cout << i->id << ","; });
std::cout << std::endl;
}
*/
} */
}
void Map::DeleteRandRegions() {
for ( auto& i : map_regions)
for (unsigned int i = 0; i < map_regions.size();)
{
if (ContiguityTest(i)) delete(i);
if (ContiguityTest(map_regions[i]))
{
delete(map_regions[i]);
map_regions.erase(begin(map_regions) + i);
std::for_each(begin(map_regions), end(map_regions), [](Region* r) { r->AddNeighbors(); }); //créer une fonction pour actualiser les voisins;
}
else i++;
}
}
bool Map::ContiguityTest(Region* r) {
auto r1 = std::find_if_not(begin(map_regions), end(map_regions), [r](Region* i) {return (r == i); });
std::set<Region*> reachable_regions, last_step;
bool Map::ContiguityTest(Region* r) { // très optimisable
auto r1 = std::find_if(begin(map_regions), end(map_regions), [r](Region* i) {return (r != i); }); //attention si pas trouvé
std::set<Region*> reachable_regions, last_step, new_step;
last_step.insert(*r1);
while (reachable_regions != last_step) {
reachable_regions = last_step;
while (last_step.size() != 0 && reachable_regions.size() != map_regions.size()-1) {
reachable_regions.insert(begin(last_step), end(last_step));
for (const auto& i : last_step) {
last_step.insert(begin(i->GetNeighbors()), end(i->GetNeighbors()));
for (auto i : last_step) {
for(auto j : i->GetNeighbors())
if(j != r && (reachable_regions.find(j)==end(reachable_regions))) new_step.insert(j);
}
last_step.erase(r); //optimisable
}
last_step = new_step;
new_step.clear();
}
return reachable_regions.size() == (map_regions.size() - 1);
}
......@@ -116,6 +124,7 @@ std::vector<std::vector<std::pair<unsigned int, unsigned int>>> Map::GetRegions(
std::vector<std::vector<std::pair<unsigned int, unsigned int>>> Regions_list;
for (auto const& i : map_regions)
{
if(i != nullptr)
Regions_list.push_back(i->GetCells());
}
return Regions_list;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter