Graph coloring
This commit is contained in:
parent
847964fd1e
commit
e43d23a5ea
|
@ -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]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue