Graph coloring

This commit is contained in:
william 2024-03-11 17:33:07 -04:00
parent 847964fd1e
commit e43d23a5ea
2 changed files with 46 additions and 24 deletions

View File

@ -3,48 +3,70 @@
using namespace gti320; using namespace gti320;
void GraphColoring::color(ParticleSystem& particleSystem) void GraphColoring::color(ParticleSystem &particleSystem) {
{
// La palette de couleurs // La palette de couleurs
ColorList C; ColorList C;
std::vector<Particle> &particles = particleSystem.getParticles(); std::vector<Particle> &particles = particleSystem.getParticles();
std::vector<Spring> &springs = particleSystem.getSprings();
// Initialiser toutes les particules avec color = -1 // Initialiser toutes les particules avec color = -1
for (Particle& p : particles) for (Particle &p: particles) {
{
p.color = -1; p.color = -1;
} }
// TODO Calculer les couleurs de toutes les particules du système. // TODO Calculer les couleurs de toutes les particules du syst<EFBFBD>me.
// Boucler sur chaque particule et appeler la fonction findColor. // Boucler sur chaque particule et appeler la fonction findColor.
// TODO Construire les partitions qui correspond à chaque couleur. // TODO Construire les partitions qui correspond <EFBFBD> chaque couleur.
// Les partitions sont représentées par un tableau d'indices de particules, un pour chaque couleur. // Les partitions sont repr<EFBFBD>sent<EFBFBD>es par un tableau d'indices de particules, un pour chaque couleur.
// Stocker les partitions dans m_partitions. // 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<int>());
}
m_partitions[color].push_back(i);
i++;
}
} }
int GraphColoring::findColor(const Particle& p, const std::vector<Particle>& particles, const std::vector<Spring>& springs, ColorList& C) const int
{ GraphColoring::findColor(const Particle &p, const std::vector<Particle> &particles, const std::vector<Spring> &springs,
// TODO Trouver la première couleur de la palette C qui n'est pas attribuée à une particule voisine. ColorList &C) const {
// Si une couleur est introuvable, ajouter une nouvelle couleur à la palette et retournez la couleur. size_t n = C.size();
// Utiliser la fonction findNeighbors pour assembler une liste de particules qui sont directement connectées à la particule p par un ressort (les voisines). auto count = new int[n];
return -1; // TODO Trouver la premi<6D>re couleur de la palette C qui n'est pas attribu<62>e <20> une particule voisine.
// Si une couleur est introuvable, ajouter une nouvelle couleur <20> la palette et retournez la couleur.
// Utiliser la fonction findNeighbors pour assembler une liste de particules qui sont directement connect<63>es <20> la particule p par un ressort (les voisines).
NeighborList neighbors = findNeighbors(p, particles, springs);
for (auto const &neighbor: neighbors) {
count[neighbor->color]++;
} }
NeighborList GraphColoring::findNeighbors(const Particle& p, const std::vector<Particle>& particles, const std::vector<Spring>& springs) const for (int c = 0; c < n; c++) {
{ if (count[c] == 0) {
return c;
}
}
return n;
}
NeighborList GraphColoring::findNeighbors(const Particle &p, const std::vector<Particle> &particles,
const std::vector<Spring> &springs) const {
NeighborList N; NeighborList N;
for (const Spring& s : springs) for (const Spring &s: springs) {
{ if (&particles[s.index0] == &p) {
if (&particles[s.index0] == &p)
{
N.push_back(&particles[s.index1]); N.push_back(&particles[s.index1]);
} } else if (&particles[s.index1] == &p) {
else if (&particles[s.index1] == &p)
{
N.push_back(&particles[s.index0]); N.push_back(&particles[s.index0]);
} }
} }

View File

@ -29,7 +29,7 @@ namespace gti320
Vector2f x; // position Vector2f x; // position
Vector2f v; // vélocité Vector2f v; // vélocité
Vector2f f; // force 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) Particle(const Vector2f& _x, const Vector2f& _v, const Vector2f& _f, float _m)
: fixed(false), m(_m), x(_x), v(_v), f(_f), color(-1) : fixed(false), m(_m), x(_x), v(_v), f(_f), color(-1)