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;
void GraphColoring::color(ParticleSystem& particleSystem)
{
void GraphColoring::color(ParticleSystem &particleSystem) {
// La palette de couleurs
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
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<EFBFBD>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 <EFBFBD> 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.
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
{
// 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<Particle> &particles, const std::vector<Spring> &springs,
ColorList &C) const {
size_t n = C.size();
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]++;
}
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 GraphColoring::findNeighbors(const Particle &p, const std::vector<Particle> &particles,
const std::vector<Spring> &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]);
}
}

View File

@ -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)