sim_ressorts/labo_physique/GraphColoring.cpp

80 lines
2.5 KiB
C++
Raw Normal View History

2024-02-27 13:20:47 -05:00
#include "GraphColoring.h"
#include "ParticleSystem.h"
using namespace gti320;
2024-03-11 17:33:07 -04:00
void GraphColoring::color(ParticleSystem &particleSystem) {
2024-03-12 15:36:37 -04:00
m_partitions.clear();
2024-02-27 13:20:47 -05:00
// La palette de couleurs
ColorList C;
2024-03-11 17:33:07 -04:00
std::vector<Particle> &particles = particleSystem.getParticles();
std::vector<Spring> &springs = particleSystem.getSprings();
2024-02-27 13:20:47 -05:00
// Initialiser toutes les particules avec color = -1
2024-03-11 17:33:07 -04:00
for (Particle &p: particles) {
2024-02-27 13:20:47 -05:00
p.color = -1;
}
2024-03-12 21:19:55 -04:00
// Calculer les couleurs de toutes les particules du syst<73>me.
2024-02-27 13:20:47 -05:00
// Boucler sur chaque particule et appeler la fonction findColor.
2024-03-12 21:19:55 -04:00
// Construire les partitions qui correspond <20> chaque couleur.
2024-03-11 17:33:07 -04:00
// Les partitions sont repr<70>sent<6E>es par un tableau d'indices de particules, un pour chaque couleur.
2024-02-27 13:20:47 -05:00
// Stocker les partitions dans m_partitions.
2024-03-11 17:33:07 -04:00
int i = 0;
for (Particle &p: particles) {
int color = findColor(p, particles, springs, C);
p.color = color;
if (m_partitions.size() <= color) {
2024-03-12 15:36:37 -04:00
m_partitions.emplace_back();
2024-03-11 17:33:07 -04:00
}
2024-03-12 15:36:37 -04:00
m_partitions[color].push_back(i * 2);
m_partitions[color].push_back(i * 2 + 1);
2024-03-11 17:33:07 -04:00
i++;
}
2024-02-27 13:20:47 -05:00
}
2024-03-11 17:33:07 -04:00
int
GraphColoring::findColor(const Particle &p, const std::vector<Particle> &particles, const std::vector<Spring> &springs,
ColorList &C) const {
2024-03-12 15:36:37 -04:00
int n = (int) C.size();
int count[n];
memset(count, 0, sizeof(int) * n);
2024-03-11 17:33:07 -04:00
2024-03-12 21:19:55 -04:00
// Trouver la premi<6D>re couleur de la palette C qui n'est pas attribu<62>e <20> une particule voisine.
2024-03-12 15:36:37 -04:00
// Si une couleur est introuvable, ajouter une nouvelle couleur <20> la palette et retournez la couleur.
2024-03-11 17:33:07 -04:00
// 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).
2024-02-27 13:20:47 -05:00
2024-03-11 17:33:07 -04:00
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;
}
}
2024-03-12 15:36:37 -04:00
C.push_back(n);
2024-03-11 17:33:07 -04:00
return n;
2024-02-27 13:20:47 -05:00
}
2024-03-11 17:33:07 -04:00
NeighborList GraphColoring::findNeighbors(const Particle &p, const std::vector<Particle> &particles,
const std::vector<Spring> &springs) const {
2024-02-27 13:20:47 -05:00
NeighborList N;
2024-03-11 17:33:07 -04:00
for (const Spring &s: springs) {
if (&particles[s.index0] == &p) {
2024-02-27 13:20:47 -05:00
N.push_back(&particles[s.index1]);
2024-03-11 17:33:07 -04:00
} else if (&particles[s.index1] == &p) {
2024-02-27 13:20:47 -05:00
N.push_back(&particles[s.index0]);
}
}
return N;
}