TD No 3
from http://vernier.frederic.free.fr/Teaching/IntroGraphic

Dessin

figure
Figure 3 : Le losange
figure
Figure 4 : Le soleil
figure
Figure 5 : Le soleil rempli

On suppose que l'on dispose des fonctions suivantes :


  1. Donnez le code de la fonction suivante qui trace un losange de petite diagonale [AB] et de couleur (r, g, b). (Figure 3)
    La grande diagonale doit être 2 fois plus grande que la petite mais ne doit pas être dessinée (en pointillée dans la figure ci-dessous).
    void losange(float xa, float ya, float xb, float yb, int r, int g, int b);

  2. void setup(){
      size(640, 480);
    }
    void draw(){
      losange (50, 60, 80, 20, 255, 0, 0);
    }
    void losange(float xa, float ya, float xb, float yb,
                 int r, int g, int b){
      float ABx = xb-xa;
      float ABy = yb-ya;
    
      float xc = xa + ABx/2 + ABy;
      float yc = ya + ABy/2 - ABx;
    
      float xd = xa + ABx/2 - ABy;
      float yd = ya + ABy/2 + ABx;
    
      line(xa, ya, xb, yb);
      line(xa, ya, xc, yc);
      line(xa, ya, xd, yd);
      line(xb, yb, xc, yc);
      line(xb, yb, xd, yd);
    }
  3. A l'aide de la fonction losange de la question précédentes, donnez le code de la fonction soleil(...) suivante qui dessine un soleil de couleur noire avec 4*n losanges autour d'un point O (xO, yO) et de rayon R: (Figure 4)
    void soleil(int xO, int yO, int R, int n) ;

  4. void soleil(int xO, int yO, int R, int n){
      for (int i=0; i<n; i=i+1){
        float a1 = PI*2*i/n;
        float a2 = PI*2*(i+1)/n;
    
        float x1 = xO+R*cos(a1);
        float y1 = yO+R*sin(a1);
        float x2 = xO+R*cos(a2);
        float y2 = yO+R*sin(a2);
    
        losange (x1,y1,x2,y2, 0,0,0);
      }
    }
    void draw(){
      soleil (width/2, height/2, 200, 12);
    }
  5. que faut-il rajouter pour remplir le soleil de jaune :(Figure 5)
    void soleil(int xO, int yO, int R, int n){
      for (int i=0; i<n; i=i+1){
        float a1 = PI*2*i/n;
        float a2 = PI*2*(i+1)/n;
    
        float x1 = xO+R*cos(a1);
        float y1 = yO+R*sin(a1);
        float x2 = xO+R*cos(a2);
        float y2 = yO+R*sin(a2);
    
        losange (x1,y1,x2,y2, 0,0,0,255);
        triangleRempli(xO, yO, x1, y1, x2, y2, 255, 255, 0 );
      }
    }
    void draw(){
      soleil (width/2, height/2, 200, 12);
    }

Indices : commencez par calculer les coordonnées des points avec les fonctions cos(...) et sin(...).

Le centre jaune... A finir plus tard quand vous aurez vu le hasard en graphisme.

Avec n=3 comme dans la figure en exemple on a donc la figure bien régulière de la page précédente. Nous voudrions un soleil bien moins régulier et introduire du hasard. Nous ne vous demandons PAS d'écrire l'algorithme correspondant mais juste d'indiquer

  1. Que changer dans les paramètres de la fonction losange ?
  2. Rajouter un parametre de longueur du grand cote
  3. Que changer dans les paramètres de la fonction soleil ?
  4. une amplitude entre les plus grand et les plus petits rayons (un min et un max)
  5. Quelle fonction de hasard utiliser pour que les piques ne changent pas brusquement de longueur d'un voisin à l'autre (rand(), gaussien(), perlin1D(), perlin2D(), perlin3D() ou voronoi2D() ? ).
  6. le bruit de Perlin1D
  7. Quelle autre primitive faut-il appeler pour remplir le soleil de jaune ?
  8. triangleRempli avaec le centre comme 3ieme poin en plus de x1,y1 et x2,y2