From 7acfd5c2f03ef9ef554bdf63d922d542b017318d Mon Sep 17 00:00:00 2001 From: Basile Sauvage Date: Tue, 11 Sep 2012 16:29:59 +0200 Subject: [PATCH] correction bug voronoi centroidaux --- include/Algo/Geometry/voronoiDiagrams.h | 2 ++ include/Algo/Geometry/voronoiDiagrams.hpp | 43 +++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/include/Algo/Geometry/voronoiDiagrams.h b/include/Algo/Geometry/voronoiDiagrams.h index f359ff8f9..eea934028 100644 --- a/include/Algo/Geometry/voronoiDiagrams.h +++ b/include/Algo/Geometry/voronoiDiagrams.h @@ -51,6 +51,7 @@ public : void setCost (const EdgeAttribute& c); void computeDiagram (); + void computeDistancesWithinRegion (Dart seed); protected : virtual void clear (); @@ -84,6 +85,7 @@ public : void cumulateEnergyOnPaths(); unsigned int moveSeeds(); // returns the number of seeds that did move + unsigned int moveSeeds2(); // returns the number of seeds that did move REAL getGlobalEnergy() {return globalEnergy;} protected : diff --git a/include/Algo/Geometry/voronoiDiagrams.hpp b/include/Algo/Geometry/voronoiDiagrams.hpp index e68108a96..a11bd126d 100644 --- a/include/Algo/Geometry/voronoiDiagrams.hpp +++ b/include/Algo/Geometry/voronoiDiagrams.hpp @@ -26,7 +26,6 @@ VoronoiDiagram::~VoronoiDiagram () template void VoronoiDiagram::clear () { - border.clear(); regions.setAllValues(0); border.clear(); front.clear(); @@ -141,6 +140,41 @@ void VoronoiDiagram::computeDiagram () } } +template +void VoronoiDiagram::computeDistancesWithinRegion (Dart seed) +{ // TODO : this algo has not yet been tested + // init + front.clear(); + vmReached.unmarkAll(); + + vmReached.mark(seed); + vertexInfo[seed].it = front.insert(std::pair(0.0, seed)); + vertexInfo[seed].valid = true; + vertexInfo[seed].pathOrigin = seed; + + //compute + while ( !front.empty() ) + { + Dart e = front.begin()->second; + float d = front.begin()->first; + + collectVertexFromFront(e); + + Traversor2VVaE tv (map, e); + for (Dart f = tv.begin(); f != tv.end(); f=tv.next()) + { + if (vmReached.isMarked(f)) + { // f has been reached + if (vertexInfo[f].valid) updateVertexInFront(f,d); // f is in the front : update + } + else + { // f has not been reached : add it to the front + if ( regions[f] == regions[e] ) addVertexToFront(f,d); + } + } + } +} + /*********************************************************** * class CentroidalVoronoiDiagram ***********************************************************/ @@ -171,6 +205,8 @@ void CentroidalVoronoiDiagram::collectVertexFromFront(Dart e){ VoronoiDiagram::collectVertexFromFront(e); } + + template void CentroidalVoronoiDiagram::cumulateEnergyOnPaths(){ globalEnergy = 0.0; @@ -183,17 +219,18 @@ void CentroidalVoronoiDiagram::cumulateEnergyOnPaths(){ template unsigned int CentroidalVoronoiDiagram::moveSeeds(){ + // TODO : je pense qu'il y a un bug : ça devrait convergerger bien mieux en n'utilisant que l'energie globale comme critere d'arret unsigned int m = 0; globalEnergy = 0.0; for (unsigned int i = 0; i < this->seeds.size(); i++) { + Dart oldSeed = this->seeds[i]; m += moveSeed(i); - globalEnergy += distances[this->seeds[i]]; + globalEnergy += distances[oldSeed]; } return m; } - template typename PFP::REAL CentroidalVoronoiDiagram::cumulateEnergyFromRoot(Dart e){ REAL distArea = areaElts[e] * distances[e]; -- GitLab