Contrôle Java du 23 mars 2001 - Licence informatique

Durée : 2h. Seuls documents autorisés : photocopies des transparents distribués en cours ; en particulier, les énoncés et corrections des TP sont interdits.

Important : la présentation et la lisibilité du code compteront dans la note finale. Vous êtes autorisé à écrire le code (et seulement le code) avec un crayon à papier si c'est parfaitement lisible (pas de crayon trop clair).

On souhaite écrire une applet qui affiche des dessins :

public class AppletDessin extends Applet {
  private Dessin dessin;

  // Méthode appelée automatiquement par le navigateur au chargement de l'applet
  public void init() {
    // Crée un dessin qui pourra contenir jusqu'à 5 cercles et rectangles
    dessin = new Dessin(5);
    dessin.add(new Cercle(....));
    . . .
  }

  // Méthode qui fait afficher l'applet dans la page Web
  // Le paramètre g représente l'endroit où sera affiché le dessin
  // et devra être utilisé par toutes les méthodes qui afficheront.
  public void paint(Graphics g) {
    dessin.dessineToi(g);
  }
}
  1. (9 pts) Ecrivez la classe Dessin, les classes Cercle et Rectangle et les autres classes qui vous seront utiles pour écrire une application extensible, c'est-à-dire telle que l'on pourra facilement ajouter le dessin d'autres figures (cf. question 3).

  2. Vous vous limiterez pour cette question aux dessins qui contiennent des rectangles dont les bords sont parallèles aux axes (repérés par les coordonnées du point haut gauche, la largeur et la hauteur), et des cercles (repérés par les coordonnées du centre et le rayon).
    On devra pouvoir ajouter facilement des cercles et des rectangles au dessin. Il ne vous est pas demandé d'écrire toutes les méthodes des classes, à part celles qui permettent de dessiner le dessin et d'ajouter des rectangles et des cercles ; en particulier, inutile d'écrire une méthode qui permette d'enlever un rectangle ou un cercle du dessin, ni d'écrire des méthodes toString().
    Utilisez au maximum le polymorphisme
    On fait du polymorphisme avec la méthode dessineToi(Graphics g) de l'interface Figure qui est implémenté par les classes Rectangle et Cercle (et on verra dans les questions suivantes qu'il est intéressant que la classe Dessin l'implémente aussi).
    Les classes
  3. (2 pts) Complétez le code de l'applet pour dessiner la "tête à Toto" ci-dessous (pour l'instant, ne dessinez pas le le chapeau pointu). Ne dessinez pas les axes. Ils ont été ajoutés pour vous rappeler que la classe Graphics travaille avec une origine en haut à gauche et les axes des x et des y orientés comme il est indiqué sur le dessin ; l'unité est le pixel.

  4. Respectez exactement les mesures indiquées sur le dessin.
    La classe AppletDessin
  5. (0,5 pt) Que faut-il ajouter à AppletDessin pour utiliser la classe java.awt.Graphics en la nommant "Graphics" seulement..
    import java.awt.Graphics;
  6. (2 pts) Ajoutez la possibilité de tracer des triangles (donnés par leurs 3 sommets). Ecrivez la classe Triangle. Que devez-vous modifier dans la classe Dessin pour pouvoir inclure des triangles dans un dessin ? Modifiez la classe AppletDessin pour ajouter le chapeau pointu à Toto. Le chapeau pointu devra être bien centré sur la tête.
    Il n'y a rien à modifier dans la classe Dessin (grâce à la bonne utilisation du polymorphisme !).
    Classe Triangle
    Dans la classe AppletDessin il faut ajouter : dessin.ajouter(new Triangle(200, 10, 300, 50, 100, 50));
  7. (1 pt) On veut mettre toutes vos classes, sauf l'applet, dans un paquetage nommé fr.unice.toto.dessin. Que devez-vous modifier dans ces classes. Que devez-vous modifier dans l'applet ?
    package fr.unice.toto.dessin;
    Dans l'applet, il faut ajouter : import fr.unice.toto.dessin.*;
  8. (2 pts) Faites toutes les modifications nécessaires dans les classes que vous avez écrites pour ajouter une méthode translater(int, int) à la classe Dessin pour translater tout le dessin. Cette translation devra changer les coordonnées des composants du dessin.
    Ajouter une interface Translatable  et une interface FigureTranslatable qui hérite des 2 interfaces Translatable et Figure.
    Ajouter une méthode translateToi(Graphics g) dans Dessin
  9. (2 pts) Que faut-il modifier pour qu'il soit possible d'ajouter des dessins entiers à un dessin (par exemple, ajouter la tête à Toto à un autre dessin), et pas seulement des rectangles, cercles et triangles ?
    Si ce n'est déjà fait, il suffit de déclarer que Dessin implémente l'interface FigureTranslatable.
  10. (1,5 pt) Vous avez peut-être remarqué que les méthodes drawOval et drawPolygon de la classe Graphics sont abstraites. On pourrait tout de même écrire g.drawOval(...) et g.drawPolygon(...) dans la méthode paint de AppletDessin. Essayez de donner une explication.
    La classe réelle de g qui est passée à l'applet est en fait une classe fille de Graphics ; cette classe fille implémente ces 2 méthodes.


Extrait de la documentation de la classe java.awt.Graphics (il n'y a pas de méthode pour tracer un cercle ; on trace une ellipse dont la largeur est égale à la hauteur).

La classe Graphics représente l'espace à 2 dimensions dans lequel on va dessiner. L'origine (0,0) est placée en haut à gauche, l'axe des abscisses est dirigé vers la droite et celui des ordonnées est dirigé vers le bas. L'unité est le pixel d'écran.

public void drawRect(int x, int y, int width, int height)

Draws the outline of the specified rectangle. The left and right edges of the rectangle are at x and x + width. The top and bottom edges are at y and y + height.
Parameters:
x - the x coordinate of the rectangle to be drawn.
y - the y coordinate of the rectangle to be drawn.
width - the width of the rectangle to be drawn.
height - the height of the rectangle to be drawn.

public abstract void drawOval(int x, int y, int width, int height)

Draws the outline of an oval. The result is a circle or ellipse that fits within the rectangle specified by the x, y, width, and height arguments.
Parameters:
x - the x coordinate of the upper left corner of the oval to be drawn.
y - the y coordinate of the upper left corner of the oval to be drawn.
width - the width of the oval to be drawn.
height - the height of the oval to be drawn.

public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)

Draws a closed polygon defined by arrays of x and y coordinates. Each pair of (x, y) coordinates defines a point. This method draws the polygon defined by nPoint line segments, where the first nPoint - 1 line segments are line segments from (xPoints[i - 1], yPoints[i - 1]) to (xPoints[i], yPoints[i]), for 1 <= i <= nPoints. The figure is automatically closed by drawing a line connecting the final point to the first point, if those points are different.
Parameters:
xPoints - an array of x coordinates.
yPoints - an array of y coordinates.
nPoints - the total number of points.
 
 

Voici la tête à Toto (c'est l'applet qui tourne ci-dessous) :

elle vous plait ??