Jump to: navigation, search

Phénomènes visuels - rond dans rond

Phénomènes visuels - rond dans rond.png

// dans le code ci-dessous, le tableau "points" n'est pas nécessaire: on pourrait très bien s'en passer puisqu'il varie à chaque frame et ne sert qu'à stocker le résultat des opérations
// je l'ai laissé parce qu'il permet de comprendre la différence entre calcul (computation, processing) et affichage (render, display) > le résultat d'un calcul n'est pas nécessairement lié à un affichage
// petit exercice pour vous: 
// A. Comment modifier le code pour se passer du tableau "points" et conserver exactement le même affichage?
// B. Comment générer des spirales? Une seule modification est nécessaire.
// C. Adapter le code pour que les couleurs des cercles se succèdent dans l'ordre chromatique? Voir color wheel

   static final int count = 17;

   PVector[] points;
   PVector[] orientations;
   float[] angles;
   int[] colors;
   float rotor;

   void setup() {

     size( 600, 600 );
     stroke(255,100);
     fill(255);

     points = new PVector[count];
     orientations = new PVector[count];
     angles = new float[count];
     colors = new int[count];
     colorMode(HSB, 1, 1, 1);
     for( int i = 0; i < count; ++i ) {
       float a = i * PI / (count * 0.5);
       points[i] = new PVector();
       orientations[i] = new PVector( cos(a), sin(a) );
       angles[i] = a;
       colors[i] = color( i * 1.f / count, 1, 1 );
     }
     colorMode(RGB);
     rotor = 1;

   }

   void draw() {

     background(0);

     rotor += 0.01;

     pushMatrix();
     translate( width * 0.5, height * 0.5 );

     float scale = width * 0.4;
     float circle = width * 0.02;

     fill( 255 );
     ellipse(
         cos(rotor) * scale * 0.5,
         sin(rotor) * scale * 0.5,
         circle * 0.5, circle * 0.5
       );

     for( int i = 0; i < count; ++i ) {
       line(
         -orientations[i].x * scale,
         -orientations[i].y * scale,
         orientations[i].x * scale,
         orientations[i].y * scale
       );
     }

     for( int i = 0; i < count; ++i ) {
       float c = cos( rotor + angles[i] );
       points[i].set(
         c * orientations[i].x * scale,
         -c * orientations[i].y * scale
         );
       fill(colors[i]);
       ellipse(
         points[i].x, 
         points[i].y, 
         circle, circle
         );
     }

     popMatrix();

   }