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:
- un cercle centré en (50,150) et de
rayon 50 en utilisant la méthode drawOval
- 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
- 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:
- à t_0= 0 heure, 0 minute et 0 seconde:
- l'aiguille des secondes As est
représentée par le segment
[(0,0),(0,1)],
- l'aiguille des minutes Am est
représentée par le
segment [(0,0),(0,1)],
- l'aiguille des heures Ah est
représentée par le
segment [(0,0),(0,0.5)].
- les règles suivantes sont applicables:
- As effectue une rotation complète autour de
l'origine en 1 minute,
- Am effectue une rotation complète autour de
l'origine en 1 heure,
- Ah effectue une rotation complète autour de
l'origine en 12 heures,
- Am ne tourne pas de manière progressive (elle ne
bouge que lorsque As est revenue en position
initiale)
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.
Questions:
-
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)
-
Quel est l'angle de la rotation effectuée chaque
minute par Am ? (0.5 point)
-
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)
-
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)
-
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)
-
Donnez l'expression de la matrice Mh(h,m,s) si Ah
tourne en même temps que Am. (1.5 points)
- 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.