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 ;
}