Séance d'exercices 10, Programmation I
Sciences et Technologies du Vivant, Semestre 1

Il est fortement conseillé de venir au cours pour mieux comprendre ce qu'on attend de vous lors de cette séance.

Installation de la bibliothèque graphique

Téléchargez le fichier swindow.tgz depuis le lien: http://cvlab.epfl.ch/~lepetit/courses/SV/files/swindow.tgz dans votre répertoire programmationI. Il contient les programmes source en C++ de la bibliothèque graphique que nous allons utiliser, et un court programme d'exemple. Après avoir tapé

cd  programmationI

(ou ce qu'il faut pour aller dans le répertoire qui contient vos exercices), tapez les commandes suivantes dans la fenêtre Terminal:

tar zxvf swindow.tgz
g++ -c swindow.cc
g++ swindow.o -L/usr/X11R6/lib -lX11 -o example example.cc 
./example

Exercice 1 - Premier essai

Créez un programme contenant:

#include <iostream>
using namespace std;

#include <stdlib.h>
#include "swindow.h"

int main(int argc, char ** argv)
{
  const int longueur = 300;
  const int hauteur  = 200;
  const int rayon_max = 50;

  SimpleWindow window("cercles", longueur, hauteur);
  window.map();

  // Remplit la fenetre en blanc:
  window.color(1, 1, 1);
  window.fill();

  // Dessine en noir:
  window.color(0, 0, 0);

  window.drawCircle(longueur / 2, hauteur / 2, rayon_max);

  window.show();

  // Attend que l'utilisateur appuie sur une touche:
  getchar();

  return 0;
}

Comment modifier ce programme pour qu'il affiche plusieurs cercles, dont le centre et le rayon seront tirés au hasard ?

Exercice 2 - Arbre

Reprenez le programme vu en cours et permettant de dessiner un arbre:

#include <stdio.h>
#include "swindow.h"

void dessine_arbre(SimpleWindow * window,
		   int x1, int y1, int x2, int y2, int nb_niveaux)
{
  window->drawLine(x1, y1, x2, y2);

  if (nb_niveaux > 0) {
    int vx = 0.8 * (x2 - x1);
    int vy = 0.8 * (y2 - y1);
    float angle = 30 * 3.14159 / 180;
    int xA = x2 + cos(angle) * vx - sin(angle) * vy;
    int yA = y2 + sin(angle) * vx + cos(angle) * vy;
    int xB = x2 + cos(-angle) * vx - sin(-angle) * vy;
    int yB = y2 + sin(-angle) * vx + cos(-angle) * vy;

    dessine_arbre(window, x2, y2, xA, yA, nb_niveaux - 1);
    dessine_arbre(window, x2, y2, xB, yB, nb_niveaux - 1);
  }
}

int main(int argc, char ** argv)
{
  const int longueur = 500;
  const int hauteur  = 500;

  SimpleWindow window("arbre", longueur, hauteur);
  window.map();

  // Remplit la fenetre en blanc:
  window.color(1, 1, 1);
  window.fill();

  // Dessine en noir:
  window.color(0, 0, 0);

  // Instructions de dessin:
  dessine_arbre(&window, 250, 450, 250, 350, 5);

  window.show();

  getchar();

  return 0;
}

  1. Comment modifier le programme pour que les segments les plus petits soient affichés en vert, le reste de l'arbre étant toujours affiché en noir ?

  2. Comment modifier le programme pour que l'arbre n'ait pas une forme régulière mais ressemble plus à celui de la figure 1 ?

Figure 1: Un arbre plus irrégulier.
\includegraphics[width=0.5\linewidth]{fig/arbre.eps}

Exercice 3 - Flocons

Créez un programme contenant:

#include <stdio.h>
#include "swindow.h"

struct Flocon
{
  int x, y;
};

void init_flocon(Flocon * f, int longueur, int hauteur)
{
  // ...
}

void dessine_flocon(SimpleWindow * window, Flocon * f)
{
  // ..
}

void avance_flocon(Flocon * f, int hauteur)
{
  f->y = f->y + 1;
}

int main(int argc, char ** argv)
{
  const int longueur = 200;
  const int hauteur  = 200;

  const int nb_flocons = 500;

  Flocon flocons[nb_flocons];

  SimpleWindow window("neige", longueur, hauteur);
  window.map();

  // Initialisation aleatoire de la position des flocons:
  for(int i = 0; i < nb_flocons; i++)
    init_flocon(flocons + i, longueur, hauteur);

  // Efface la fenetre en bleu clair:
  window.color(1, 0.5, 0.5);
  window.fill();

  // Dessine en blanc:
  window.color(1, 1, 1);

  // Affichage des flocons:
  for(int i = 0; i < nb_flocons; i++)
    dessine_flocon(&window, flocons + i);

  window.show();

  getchar();

  return 0;
}

  1. Écrivez la fonction init_flocon qui initialise les coordonnées du flocon passé en paramètre à une position aléatoire, et la fonction affiche_flocon, qui affiche le flocon avec un pixel aux coordonnées du flocon. Le programme n'affiche pour l'instant que des points statiques.

  2. Ajoutez une boucle comme vu en cours pour que les flocons soient animés.

  3. Modifiez la fonction avance_flocon pour qu'un flocon qui dépasse le bas de la fenêtre recommence à tomber du haut de la fenêtre.

  4. Le truc pour avoir un mouvement ``réaliste'' est de tirer le déplacement du flocon aléatoirement à chaque fois. Modifiez la fonction avance_flocon pour tirer le déplacement en y aléatoirement entre 0 et 3, le déplacement en x entre -2 et +2.

Exercice 4 - Soyons créatifs

Modifiez votre programme pour qu'il reproduise l'un des exemples vus en cours, ou mieux, développez-en un vous-même.

Exercice 5 - Courbe de Von Koch ($\dag $)

Comment afficher la courbe de la figure [*] à l'aide d'une fonction récursive ?

Figure: Les premiers niveaux de récursion pour afficher une courbe de Von Koch.
\includegraphics[width=0.6\linewidth]{fig/vonkoch2.eps}


Retour