Préparation `a l`Agregegation – épreuve de modelisation TP 3

Transcription

Préparation `a l`Agregegation – épreuve de modelisation TP 3
Préparation à l’Agregegation – épreuve de modelisation
TP 3 programmation: fichiers et bibliothèque graphique
César Rodrı́guez∗
9 Octobre 2012
Le but de ce TP est de
• Apprendre à lire et écrire des fichiers,
• Apprendre à utiliser la librerie de graphies d’OCaml (module Graphics), et
• Apprendre à afficher et sauvegarder des images en format BMP.
1
Lecture et écriture d’un fichier
Deux primitives permettent d’ouvrir un fichier:
• open in :
string.
string -> in channel : Ouvre en lecture le fichier indiqué par l’arguemnt
• open out :
string.
string -> in channel : Ouvre en écriture le fichier indiqué par l’argument
Selon que votre fichier a été ouvert en lecture ou écriture, plusieurs fonctions sont disponibles.
Pour les fichiers ouverts en lecture :
• input char :
in channel -> char. Lit un char du fichier indiqué par in channel
• input line : in channel -> string. Lit une suite de char du fichier indiqué par
in channel tant qu’il ne rencontre par de \n.
• input byte : in channel -> int. Lit un byte du fichier indiqué par in channel.
input char c in est équivalent à char of int (input byte c in).
• input : in channel -> string -> int -> int. input ic buf pos len lit, à partir
de la position pos, len caractères du fichier ic. Il sauvegarde tout cela dans buf
Pour les fichiers ouverts en écriture :
• output char :
out channel -> char -> unit
• output string :
• output byte :
out channel -> string -> unit
out channel -> int -> unit
∗
La plupart du contenu de ce document était déjà présent sur les versions de ce TP de Vincent Cheval
(2011/2012) et Jean-Loup Carré (2009/2010).
1
Exercice 1 A partir des fonctions ci-dessus :
• Ecrire une fonction read text : string -> string list qui ouvre un fichier texte et
qui renvoie une liste telle que chaque élément de la liste est une ligne du fichier.
• Ecrire une fonction reverse : string -> string -> unit tel que reverse in path
out path ouvre le fichier dont le chemin est in path et le recopie, en inversant chaque
ligne, dans fichier au chemin out path.
2
La librairie Graphics
OCaml fournit une libraire graphique assez simple à utiliser : Graphics. Pour les exercices
suivants, il est conseillé de regarder la documentation d’OCaml sur le module Graphics.
Exercice 2 Écrire une fonction de type string -> unit qui ouvre une fenêtre graphique de
taille 600 × 400 pixels telle que :
• l’argument de la fonction est le titre de la fenêtre
• un carré de couleur verte et de taille 30 × 30 est affiché au centre de la fenêtre.
Le type color est utilisé dans la librairie Graphics pour définir les couleurs d’un pixel.
Exercice 3 Écrire les fonctionnes suivantes:
• gray : transforme l’image affiché sur la fenêtre en niveau de gris.
• mirror : inverse l’image horizontalement.
3
Courbes fractales
Dans cette section nous allons écrire un ensemble de fonctions permettant de tracer des courbes
fractales de type IFS (Iterated Function System). Pour cela, nous considérons le type tortue:
type tortle = {
a : float;
dx : float;
dy : float;
x : float;
y : float
};;
Ce type record représente un pointeur, placé sur les coordonnées x et y de la fenêtre, dont
la direction d’écriture est doublement représenté par l’angle a (en radians), et les composants
dx et dy d’un vecteur unitaire.
Exercice 4 Définir la fonction setup,
val setup : int -> int -> tortle
qui (1) initialise le module graphique, (2) crée une fenêtre de dimensions données, (3) place le
pointeur au centre de la fenêtre, et (4) renvoi un valeur de type tortle représentant ce curseur.
2
Exercice 5 Définir des fonctions left et right, avec les types
val left : tortle -> float -> tortle
val right : tortle -> float -> tortle
qui tournent la direction d’écriture du pointeur pris en argument à gauche et à droite, et renvoient le curseur mis au jour. L’angle, valeur flottant, est donné en degrés.
Exercice 6 Définir des fonctions forward, backward et goto avec les types
val forward : tortle -> float -> tortle
val backward : tortle -> float -> tortle
val goto : tortle -> int -> int -> tortle
Les deux premières doivent écrire une ligne suivant la direction donnée (forward) et la direction
inverse (backward) du vecteur direction défini par le pointeur. La fonction goto place le pointeur
sur les coordonnées prises par argument, sans écrire aucune ligne.
Exercice 7 Écrire une fonction wait, prenant un pointeur et renvoyant le même pointeur. Elle
doit imprimer sur la terminal l’état du curseur et attendre une frappe de clavier.
Exercice 8 Construire une fonction poly de type tortle -> float -> int -> tortle tel
que poly t l n désigne un polyèdre de n côtés de longueur l.
Exercice 9 ( Courbe de Koch) Une courbe fractale peut être défini comme une courbe composé
de différentes morceaux isomorphes à la courbe. La courbe de Koch de taille l est le résultat de
composer quatre courbes de Koch de taille l/3 de la manière suivante:
koch(l/3)
koch(l/3)
koch(l/3)
koch(l/3)
koch(l)
Construire une fonction koch de type tortle -> int -> float -> tortle tel que koch d l
désigne l’approximation de longueur l résultante d’itérer la définition de la courbe un nombre
d de fois.
Exercice 10 ( Flocon de Koch) Le flocon de Koch s’obtient en plaçant trois courbes de koch
sur les côtés d’un triangle équilatéral. Construire une fonction snowflake de type tortle ->
int -> float -> tortle qui designe une approximation du flocon de Koch.
Exercice 11 ( Dragon de Lévy) Le dragon de Lévy de taille l est le résultat de placer deux
dragons de taille approprié sur les deux côtés d’un triangle rectangle:
dragon(l0 )
dragon(l0 )
dragon(l)
Construire une fonction dragon de type tortle -> int -> float -> tortle qui désigne une
approximation du dragon de Lévy.
3
4
Le format BMP
L’écriture d’une image au format BMP est assez simple et ne demande aucune compression.
Bien qu’il existe plusieurs variantes pour l’écriture d’une image au format bitmap, on utilisera
une seule variante: les bitmaps de 24 bit par pixel, sans compression.
Dans ce cadre là, le fichier Bitmap est composé de :
• Un premier header
• Un deuxième header
• Le tableau de pixel avec leur couleur.
Description du premier header :
Taille (en byte)
2
4
2
2
4
Valeur
’BM’ : identifiant d’un Bitmap
Taille du fichier
Réservée à l’application ayant créer le fichier
Réservée à l’application ayant créer le fichier
Position où commence la description des pixels
Description du deuxième header :
Taille (en byte)
4
4
4
2
2
4
4
4
4
4
4
Valeur
’40’ : taille de ce header
longueur de l’image (peut être négatif)
hauteur de l’image (peut être négatif)
’1’
Nombre de bit par pixel (dans notre cas ’24’)
Compression (dans notre cas ’0’)
Taille du stockage des pixels
Résolution horizontale
Résolution verticale
Nombre de couleur dans la palette (dans notre cas 0)
Nombre de couleur spéciales (dans notre cas 0)
Description du tableau de pixel :
Comme le nombre de bit par pixel est 24, chaque pixel est représenté par 3 bytes : le premier
pour la couleur rouge, le deuxième pour la couleur verte et le troisiéme pour la couleur bleue.
Si h est la hauteur et w la longueur, alors les pixels sont lus dans l’ordre suivant :
• Pixel (0, h − 1)
• Pixel (1, h − 1)
• ...
• Pixel (w − 1, h − 1)
• Pixel (0, h − 2)
• ...
4
• Pixel (w − 1, h − 2)
• ...
Exercice 12 Écrire une fonction qui ouvre un fichier en lecture et écrit dans un nouveau fichier
la liste des bytes du fichier ouvert (un byte par ligne pour faciliter la lecture).
Exercice 13 Ecrire deux fonctions:
val: load : string -> unit
val: save : string -> unit
La première doit lire et afficher un fichier BMP sur la fenêtre graphique, et la deuxième doit
permettre de sauvegarder dans un fichier BMP l’image affiché dans la fenêtre.
5