diff --git a/labo_physique/GraphColoring.cpp b/labo_physique/GraphColoring.cpp index d2421be..043ad26 100644 --- a/labo_physique/GraphColoring.cpp +++ b/labo_physique/GraphColoring.cpp @@ -3,48 +3,70 @@ using namespace gti320; -void GraphColoring::color(ParticleSystem& particleSystem) -{ +void GraphColoring::color(ParticleSystem &particleSystem) { // La palette de couleurs ColorList C; - std::vector& particles = particleSystem.getParticles(); + std::vector &particles = particleSystem.getParticles(); + std::vector &springs = particleSystem.getSprings(); // Initialiser toutes les particules avec color = -1 - for (Particle& p : particles) - { + for (Particle &p: particles) { p.color = -1; } - // TODO Calculer les couleurs de toutes les particules du système. + // TODO Calculer les couleurs de toutes les particules du syst�me. // Boucler sur chaque particule et appeler la fonction findColor. - // TODO Construire les partitions qui correspond à chaque couleur. - // Les partitions sont représentées par un tableau d'indices de particules, un pour chaque couleur. + // TODO Construire les partitions qui correspond � chaque couleur. + // Les partitions sont repr�sent�es par un tableau d'indices de particules, un pour chaque couleur. // Stocker les partitions dans m_partitions. + + int i = 0; + for (Particle &p: particles) { + int color = findColor(p, particles, springs, C); + p.color = color; + + if (m_partitions.size() <= color) { + m_partitions.push_back(std::vector()); + } + m_partitions[color].push_back(i); + i++; + } } -int GraphColoring::findColor(const Particle& p, const std::vector& particles, const std::vector& springs, ColorList& C) const -{ - // TODO Trouver la première couleur de la palette C qui n'est pas attribuée à une particule voisine. - // Si une couleur est introuvable, ajouter une nouvelle couleur à la palette et retournez la couleur. - // Utiliser la fonction findNeighbors pour assembler une liste de particules qui sont directement connectées à la particule p par un ressort (les voisines). +int +GraphColoring::findColor(const Particle &p, const std::vector &particles, const std::vector &springs, + ColorList &C) const { + size_t n = C.size(); + auto count = new int[n]; - return -1; + // TODO Trouver la premi�re couleur de la palette C qui n'est pas attribu�e � une particule voisine. + // Si une couleur est introuvable, ajouter une nouvelle couleur � la palette et retournez la couleur. + // Utiliser la fonction findNeighbors pour assembler une liste de particules qui sont directement connect�es � la particule p par un ressort (les voisines). + + NeighborList neighbors = findNeighbors(p, particles, springs); + for (auto const &neighbor: neighbors) { + count[neighbor->color]++; + } + + for (int c = 0; c < n; c++) { + if (count[c] == 0) { + return c; + } + } + + return n; } -NeighborList GraphColoring::findNeighbors(const Particle& p, const std::vector& particles, const std::vector& springs) const -{ +NeighborList GraphColoring::findNeighbors(const Particle &p, const std::vector &particles, + const std::vector &springs) const { NeighborList N; - for (const Spring& s : springs) - { - if (&particles[s.index0] == &p) - { + for (const Spring &s: springs) { + if (&particles[s.index0] == &p) { N.push_back(&particles[s.index1]); - } - else if (&particles[s.index1] == &p) - { + } else if (&particles[s.index1] == &p) { N.push_back(&particles[s.index0]); } } diff --git a/labo_physique/ParticleSystem.h b/labo_physique/ParticleSystem.h index a1a9a2c..2a24ca6 100644 --- a/labo_physique/ParticleSystem.h +++ b/labo_physique/ParticleSystem.h @@ -29,7 +29,7 @@ namespace gti320 Vector2f x; // position Vector2f v; // vélocité Vector2f f; // force - int color; // coleur de particule + int color; // couleur de particule Particle(const Vector2f& _x, const Vector2f& _v, const Vector2f& _f, float _m) : fixed(false), m(_m), x(_x), v(_v), f(_f), color(-1)