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