Le but de ce TD est de réaliser un même type algébrique en Java et en OCaml. On choisit ici l'exemple très simple d'un type représentant des images. Une image est
int getWidth() int getHeight() void move(int dx, int dy) void draw(Graphics g)
Définir trois sous-classes Rectangle, Circle et Union de la classe Picture. Le constructeur Rectangle(int x1, int y1, int x2, int y2) spécifie les coins supérieur gauche et inférieur droit du rectangle. Le constructeur Circle(int x, int y, int r) spécifie le centre et le rayon. Le constructeur Union(Picture p1, Picture p2) construit l'union des deux images p1 et p2.
On dessinera l'image en utilisant la bibliothèque java.awt.Graphics de Java. Attention, les coordonnées graphiques de Java ne sont pas les coordonnées cartésiennes usuelles :
Indication : il pourra être utile de conserver dans chaque objet de la classe Picture une spécification du plus petit rectangle englobant (par exemple sous la forme coin supérieur gauche + dimensions).
Avec le fichier Test.java fourni, vous devez obtenir la fenêtre suivante :
stop dim = 40,140 car dim = 200,80
Déposer les fichiers Picture.java, Rectangle.java, Circle.java et Union.java :
Dans un fichier picture.ml, introduire un type t immuable pour représenter une image, des fonctions
val rectangle: int -> int -> int -> int -> t (** inférieur-gauche et supérieur-droit *) val circle: int -> int -> int -> t (** centre et rayon *) val union: t -> t -> tpour construire des images et des fonctions
val width: t -> int val height: t -> int val move: int -> int -> t -> t val draw: t -> unit
On dessinera l'image en utilisant la bibliothèque Graphics d'OCaml. Attention, les coordonnées graphiques d'OCaml sont, à la différence de Java, les coordonnées cartésiennes usuelles :
Pour exécuter, cliquer droit sur test.native dans le projet, puis Run As et OCaml executable (ou Ctrl-F11 ou l'icône Run As dans la barre d'outils d'Eclipse). Vous devez obtenir la fenêtre suivante :
stop dim = 40,140 car dim = 200,80
Déposer le fichier picture.ml :
Ajouter les qualificatifs protected et private appropriés sur les champs des différentes classes.
Nous vous proposons une solution.
Bien sûr, ce n'est pas la seule.