| 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.
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
tar zxvf ... décompresse le fichier
swindow.tgz et crée 3 fichiers swindow.cc swindow.h
example.cc.
g++ -c swindow.cc compile le fichier contenant les
fonctions que nous allons utiliser dans le fichier swindow.o
contenant le code exécutable de ces fonctions.
g++ swindow.o... compile le fichier
example.cc, et crée l'exécutable example en y ajoutant le
fichier swindow.o et la bibliothèque X11.
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 ?
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;
}
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;
}
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.
avance_flocon pour qu'un flocon qui
dépasse le bas de la fenêtre recommence à tomber du haut de la fenêtre.
avance_flocon pour tirer le déplacement en y
aléatoirement entre 0 et 3, le déplacement en x entre -2 et +2.
Modifiez votre programme pour qu'il reproduise l'un des exemples vus en cours, ou mieux, développez-en un vous-même.
Comment afficher la courbe de la figure
à l'aide d'une fonction récursive ?