Infographie - octobre 2004

TD: Création d'une application JAVA graphique 2D

Nous allons éditer les fichiers source JAVA en utilisant le bloc-note (notepad) de Window$.

Si vous créez une classe toto, le nom du fichier doit être toto.java

Nous aurons besoin de la classes java awt, pour créer les objets graphiques (documentation)

Pour utiliser les méthodes de ces classes, il faut les "importer":
import java.awt.*;
Pour créer une fenêtre graphique, il faut construire un objet héritant de la classe Frame, ainsi:

Fichier source toto.java:
import java.awt.*;

public class toto extends Frame {

  public void paint(Graphics crayon)

  {  // code decrivant ce qu'il faut dessiner dans la fenetre
   // par exemple:
   crayon.setColor(Color.black); // selection de la couleur du crayon
   crayon.drawLine(0,0,100,200);  // trace d'un trait entre (0,0) et (100,200)
  }

  public static void main(String[] args) {
    // code execute en invoquant "java toto"
      Frame f = new toto(); // creation de la fenetre
      f.setSize(100, 200);  // definition de la taille de la fenetre
      f.setVisible(true);   // on rend la fenetre visible
  }

}
Pour compiler le code, il faut invoquer le compilateur JAVA avec le fichier source (en supposant que le repertoire courant est celui où se trouve toto.java):

Pour cela on lance l'exécuteur de commande (probablement dans le menu >Programmes>Accessoires) et on tape:
c:\j2sdk1.4.2_05\bin\javac toto.java
(en supposant que le compilateur JAVA est installé dans le répertoire c:\j2sdk1.4.2_05)

un fichier toto.class a alors été créé.

On peut ensuite visualiser le résultat en lançant la commande suivante (depuis le repertoire où se trouve le fichier toto.class)
c:\j2sdk1.4.2_05\bin\java toto

Exercice 1: Trait

Créez une fenêtre JAVA affichant un trait avec la méthode drawLine.

Exercice 2: Cercles

Créez une fenetre JAVA affichant:
  1. un cercle centré en (50,150) et de rayon 50 en utilisant la méthode drawOval
  2. un cercle centré en (160,150) et de rayon 50 en utilisant seulement des traits avec la méthode drawLine (il faudra par exemple faire une boucle for ou while pour tracer des bouts de droites en utilisant les fonctions mathématiques: Math.cos et Math.sin
  3. un cercle centré en (220,150) et de rayon 50 en utilisant l'algorithme de Michener
Comparez les trois cercles.

Exercice 3

Créez une fenetre JAVA affichant un cercle de manière progressive (par exemple environ 60 secondes pour dessiner le cercle complet).

Pour cela vous devrez utiliser des thread (un(e) thread est un contexte d'execution ou une structure de contrôle unique exécutée en séquence à l'intérieur d'une application) et rendre votre classe Runnable:

Fichier source totorun.java:
import java.awt.*;

// exemple dessinant un trait de maniere progressive

public class totorun extends Frame implements Runnable {

    int x = 0; //variables globale à l'objet
           //pouvant être manipulée dans les méthodes
    int y = 0;

    public void run() { 
        while (true) {
            repaint();//on redessine dans la fenetre
            try { Thread.sleep(100); } //le temps de pause est en milisecondes
            catch(InterruptedException e){ }    
	    x = x+1; // à chaque pas, on incrémente x et y de 1
	    y = y+1;
            }
    }

    public void update(Graphics g) {
     // code a executer a chaque appel de repaint(), par exemple:
     paint(g);
    }
    
    public totorun() {
     // constructeur pour creer et demarrer le thread
     // 
	Thread t = new Thread(this); 
	t.start();
    }

    public void paint (Graphics g) 
    {
      // on dessine
      g.setColor(Color.black); 
      g.drawLine(0,0,x,y); // on dessine un trait entre (0,0) et (x,y)
    }

  public static void main(String[] args) {
    // code execute en invoquant "java toto"
      Frame f = new totorun(); // creation de la fenetre
      f.setSize(100, 200);  // definition de la taille de la fenetre
      f.setVisible(true);   // on rend la fenetre visible
  }

 }

Exercice 4: Horloge

On souhaite dessiner une horloge centrée en (0,0), sachant que: On souhaite donner les matrices de transformation Mh(h,m,s), Mm(h,m,s) et Ms(h,m,s) donnant respectivement les positions de Ah, Am et As, lorsqu'il est h heures m minutes et s secondes à partir des positions initiales.
image
			    horloge exercice 5

Questions:

  1. Quel est l'angle de la rotation effectuée chaque seconde par As ?
    NB: attention, le sens trigonométrique est contraire au sens des aiguilles d'une montre. (0.5 point)
  2. Quel est l'angle de la rotation effectuée chaque minute par Am ? (0.5 point)
  3. Quel est l'angle de la rotation effectuée chaque heure par Ah si Ah ne tourne que lorsque Am revient en position initiale ? (0.5 point)
  4. Quel est l'angle de la rotation effectuée chaque minute par Ah si Ah tourne en même temps que Am ? (0.5 point)
  5. Donnez l'expression des matrices Mh(h,m,s), Mm(h,m,s) et Ms(h,m,s) si Ah ne tourne pas en même temps que Am. (1.5 points)
  6. Donnez l'expression de la matrice Mh(h,m,s) si Ah tourne en même temps que Am. (1.5 points)
  7. Dessiner l'horloge dans une application graphique JAVA.
    On pourra utiliser pour cela la classe util (import java.util.*;) pour utiliser la classe Calendar (documentation), qu'on peut utiliser ainsi:
    	Calendar d  = Calendar.getInstance();
    	int h = d.get(Calendar.HOUR);
    	int m = d.get(Calendar.MINUTE);
    	int s = d.get(Calendar.SECOND);
    
    pour obtenir l'heure, les minutes et les secondes courantes.