// Représentation de A5 par action des rotations sur un dodécaèdre.
// On partitionne les 30 arêtes du dodécaèdre en 5 sous-ensembles de 6 arêtes, chaque sous-ensemble se voyant attribué une couleur.
// Une rotation laissant globalement invariant le dodécaèdre correspond à une permutation paire des couleurs, et réciproquement.

#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"
#include "stones.inc"
#include "woods.inc"                                                
#include "glass.inc"

// ***************************
// Installation de la caméra *
// ***************************
// On installe la caméra et on définit son orientation.
// L'axe des x est vers la droite, l'axe des y vers le haut, l'axe des z vers le fond.


camera {orthographic
#declare DistanceObservateur = 4;
#declare HauteurObservateur = 1;
#declare Angle = -2;  // pour une vision stéréoscopique :
                     // < 0 pour l'oeil gauche (G.POV) . L'image devra être placée à DROITE en vision croisée
                     // > 0 pour l'oeil droit (D.POV) (en degré), l'image devra être placée à GAUCHE. 
                     // En général 3 à 5 degré d'écart entre les deux yeux. Angle est en degré. 
//Définir l'angle pour choisir l'oeil

location  <DistanceObservateur*cos(Angle/180*pi), HauteurObservateur, DistanceObservateur*sin(Angle/180*3.142)> 
look_at  <0,0,0>
//rotate y*0
}

#declare cc=360;       // remplacer cc par clock pour une animation, clock variant de 1 à 120+250+80=450.
// L'animation prévue est :
// 120 images fixes identiques. Utiliser les commandes de copies en ligne de commande, par exemple :
//      for i in {2..9}; do cp G001.png G00$i.png; done
//      for i in {10..99}; do cp G001.png G0$i.png; done
//      for i in {100..120}; do cp G001.png G$i.png; done
// 250 images pour effectuer une rotation de 4*pi/5, d'axe passant par deux sommets diamétralement opposés,
// 80 images fixes sur la position finale.
//      for i in {371..450}; do cp G370.png G$i.png; done

// On définit le fond (par défaut noir)
background { color Black}  

// ********
// Objets *
// ********

#declare phi = 1.618033989;        // nombre d'or

#declare rayonSphere = 0.07;       // rayon des sphères sommets
#declare rayonCyl = 0.03;          // rayon des cylindres arêtes

#declare Couleur1 = Yellow;        // couleurs des cinq trirectangles
#declare Couleur2 = Red; 
#declare Couleur3 = SkyBlue;
#declare Couleur4 = Green;
#declare Couleur5 = Orange;

#if (cc<=120)                      // Définition de l'angle de rotation, en degrés
#declare anglerot5 = 0;            // anglerot5 pour les rotations d'axe passant par deux sommets diamétralement opposés, correspondant aux permutations circulaires (a b c d e)
#declare anglerot3 = 0;            // anglerot3 pour les rotations d'axe passant par les centres de deux faces diamétralement opposées, correspondant aux permutations circulaires (a b c)
#declare anglerot22 = 0;           // anglerot22 pour les rotations d'axe passant par les milieux de deux segment diamétralement opposées, correspondant aux permutations (a b)(c d)
#elseif (cc<=370) 
#declare anglerot5 = 4*180/5*(cc-120)/(370-120);
#declare anglerot3 = 2*180/3*(cc-120)/(370-120);
#declare anglerot22 = 180*(cc-120)/(370-120);
#else
#declare anglerot5 = 4*180/5;
#declare anglerot3 = 2*180/3;
#declare anglerot22 = 180;
#end

// Liste des sommets
#declare S = array[20] {<0,1/phi,phi>, <0,1/phi,-phi>, <0,-1/phi,phi>, <0,-1/phi,-phi>,
                        <1/phi,phi,0>, <1/phi,-phi,0>, <-1/phi,phi,0>, <-1/phi,-phi,0>,
                        <phi,0,1/phi>, <phi,0,-1/phi>, <-phi,0,1/phi>, <-phi,0,-1/phi>,
                        <1,1,1>, <1,1,-1>, <1,-1,1>, <1,-1,-1>,
                        <-1,1,1>, <-1,1,-1>, <-1,-1,1>, <-1,-1,-1>};


union {
    #declare index = 0;
    #while (index<20)
    sphere {S[index], rayonSphere texture {Silver_Metal} pigment {color White}}
    #declare index = index+1;
    #end

    cylinder {S[12],S[0], rayonCyl texture {Silver_Metal} pigment {color Couleur1}}
    cylinder {S[19],S[3], rayonCyl texture {Silver_Metal} pigment {color Couleur1}}
    cylinder {S[6],S[17], rayonCyl texture {Silver_Metal} pigment {color Couleur1}}
    cylinder {S[5],S[14], rayonCyl texture {Silver_Metal} pigment {color Couleur1}}
    cylinder {S[9],S[13], rayonCyl texture {Silver_Metal} pigment {color Couleur1}}
    cylinder {S[10],S[18], rayonCyl texture {Silver_Metal} pigment {color Couleur1}}

    cylinder {S[12],S[4], rayonCyl texture {Silver_Metal} pigment {color Couleur2}}
    cylinder {S[19],S[7], rayonCyl texture {Silver_Metal} pigment {color Couleur2}}
    cylinder {S[16],S[10], rayonCyl texture {Silver_Metal} pigment {color Couleur2}}
    cylinder {S[15],S[9], rayonCyl texture {Silver_Metal} pigment {color Couleur2}}
    cylinder {S[2],S[14], rayonCyl texture {Silver_Metal} pigment {color Couleur2}}
    cylinder {S[1],S[17], rayonCyl texture {Silver_Metal} pigment {color Couleur2}}
    
    cylinder {S[12],S[8], rayonCyl texture {Silver_Metal} pigment {color Couleur3}}
    cylinder {S[19],S[11], rayonCyl texture {Silver_Metal} pigment {color Couleur3}}
    cylinder {S[6],S[16], rayonCyl texture {Silver_Metal} pigment {color Couleur3}}
    cylinder {S[5],S[15], rayonCyl texture {Silver_Metal} pigment {color Couleur3}}
    cylinder {S[2],S[18], rayonCyl texture {Silver_Metal} pigment {color Couleur3}}
    cylinder {S[1],S[13], rayonCyl texture {Silver_Metal} pigment {color Couleur3}}
    
    cylinder {S[4],S[13], rayonCyl texture {Silver_Metal} pigment {color Couleur4}}
    cylinder {S[7],S[18], rayonCyl texture {Silver_Metal} pigment {color Couleur4}}
    cylinder {S[16],S[0], rayonCyl texture {Silver_Metal} pigment {color Couleur4}}
    cylinder {S[15],S[3], rayonCyl texture {Silver_Metal} pigment {color Couleur4}}
    cylinder {S[14],S[8], rayonCyl texture {Silver_Metal} pigment {color Couleur4}}
    cylinder {S[17],S[11], rayonCyl texture {Silver_Metal} pigment {color Couleur4}}

    cylinder {S[4],S[6], rayonCyl texture {Silver_Metal} pigment {color Couleur5}}
    cylinder {S[7],S[5], rayonCyl texture {Silver_Metal} pigment {color Couleur5}}
    cylinder {S[0],S[2], rayonCyl texture {Silver_Metal} pigment {color Couleur5}}
    cylinder {S[3],S[1], rayonCyl texture {Silver_Metal} pigment {color Couleur5}}
    cylinder {S[8],S[9], rayonCyl texture {Silver_Metal} pigment {color Couleur5}}
    cylinder {S[11],S[10], rayonCyl texture {Silver_Metal} pigment {color Couleur5}}
    
    // Mettre en commentaire les rotations non désirées
    
    // Rotation d'axe passant par les centres de deux faces opposées, correspondant à une permutation circulaire (a b c d e) des cinq couleurs.
    // L'une des faces est ici (S[12], S[0], S[16], S[6], S[4])
    rotate -x*degrees(atan((2+phi)/(3*phi+1)))
    rotate y*anglerot5
    rotate x*degrees(atan((2+phi)/(3*phi+1)))
    
    // Rotation d'axe passant par deux sommets diamétralement opposés, correspondant à une permutation circulaire (a b c) des trois couleurs.
    // L'un des sommets est ici S[12] = <1,1,1>
    //rotate y*45
    //rotate z*degrees(atan(sqrt(2)))
    //rotate y*anglerot3
    //rotate -z*degrees(atan(sqrt(2)))    
    //rotate -y*45
    
    // Demi-tour passant par le milieu de deux arêtes opposées, correspondant à une permutation (a b)(c d).
    // L'une des arêtes est ici (S[6], S[4])
    //rotate y*anglerot22
    
    
}    

// *********
// Lumière *
// *********

light_source { <10, 0, 0> color White shadowless}
light_source { <-10, 0, 0> color White shadowless}
light_source { <0, 10, 0> color White shadowless}
light_source { <0, -10, 0> color White shadowless}
light_source { <0, 0, 10> color White shadowless}
light_source { <0, 0, -10> color White shadowless}

