Gym tonique.

publicité
IUT Colmar TP3 : Abstraction/Polymorphisme
Module E5
TP3 : Initiation POO/Java Abstraction/Polymorphisme
Objectifs : Le but de ce TP est :

A partir des classes réalisées dans le TP2, compléter le programme pour utiliser les formes dans une
collection. Ce TP vous permettra de découvrir les notions d’abstraction, de polymorphisme et de
collection dynamique d’objet.
Gym tonique.
But :
Créer des dessins utilisant des formes représentant des individus et les faire bouger.
Déroulement du TP



Créer un nouveau package (TP3)
Dans le répertoire de votre package, copier les cinq fichiers du TP2.
La structure de votre programme aura le diagramme de classes suivant :
Didier Petitjean
1
17/04/2017
IUT Colmar TP3 : Abstraction/Polymorphisme








Rajouter la classe Ligne. Programmer ses méthodes. DeplacerDebut et deplacerFin
permettent de ne déplacer qu’un seul point de la ligne (stretch).
Ecrire la classe abstraite Humain dérivée de Forme. Son constructeur ajoutera des
formes (Lignes, cercle) communes à la représentation d’un homme et d’une femme.
Vous utiliserez un ArrayList pour « stocker » ces éléments. Ecrire les cinq autres
méthodes.
Ecrire les classes Homme et Femme qui ne comprend qu’un constructeur qui rajoute
les éléments du dessin propres à l’individu.
Modifier la classe Dessin (ajouterObjet) pour pouvoir rajouter un homme ou une
femme.
Tester l’application avec un seul individu
Changer dans Dessin maForme pour lui adjoindre une collection. Modifier alors
ajouterObjet, deplacer, upDate. Tester dans appliForme pour ajouter plusieurs
individus.
Rajouter flechir et etendre à dessin.
Modifier l’application pour créer le mouvement tension/extension de votre ribambelle.
Didier Petitjean
2
17/04/2017
IUT Colmar TP3 : Abstraction/Polymorphisme
/* Permet de dessiner une ligne et de la déplacer
* TP3 : Didier Petitjean le 08/08/2006 */
package TP3;
import java.awt.*;
import java.math.*;
public class Ligne implements Forme{
private Point debut,fin;
/*************/* Trois constructeurs **********************/
public Ligne() {
debut = new Point(); //Par defaut à 0,0
fin = new Point(20,20);
}
public Ligne(int xDebut,int yDebut, int xFin,int yFin) {
debut = new Point(xDebut,yDebut);
fin = new Point(xFin,yFin);
}
public Ligne(Point debut, Point fin) {
this.debut=new Point(debut);
this.fin=new Point(fin);
}
/************************************************************/
public void dessiner(Graphics g)
{ g.drawLine(debut.x,debut.y,fin.x,fin.y);
}
public void deplacer(int dx, int dy)
{ debut.x+=dx;
debut.y+=dy;
fin.x+=dx;
fin.y+=dy;
}
public void deplacer(Point vecteur)
{ debut.x+=vecteur.x;
debut.y+=vecteur.y;
debut.x+=vecteur.x;
debut.y+=vecteur.y;
}
/** Permet le édplacement juste du point de début */
public void deplacerDebut(Point vecteur)
{ debut.x+=vecteur.x;
debut.y+=vecteur.y;
}
/** Permet le édplacement juste du point de fin */
public void deplacerFin(Point vecteur)
{ fin.x+=vecteur.x;
fin.y+=vecteur.y;
}
/** Permet le retour du point haut gauche du rectangle contenant la ligne */
public Point getPointHautgauche()
{ Point retour = new Point();
retour.x-=(debut.x<fin.x?debut.x:fin.x);
retour.y-=(debut.y<fin.y?debut.y:fin.y);
return retour;
}
/** Permet le retour du point bas droit du rectangle contenant la ligne*/
public Point getPointBasDroit()
{ Point retour = new Point();
retour.x-=(debut.x>fin.x?debut.x:fin.x);
retour.y-=(debut.y>fin.y?debut.y:fin.y);
return retour;
}}
Didier Petitjean
3
17/04/2017
IUT Colmar TP3 : Abstraction/Polymorphisme
/* Représentation factoriser d’un dessin homme/femme */
package TP3;
import java.lang.reflect.Array;
import java.util.*;
import java.awt.*;
public abstract class Humain implements Forme {
Collection corps = new ArrayList();
private Ligne cuisseDroite,cuisseGauche,tibiaDroit,tibiaGauche;
private Ligne brasDroit,brasGauche;
int taille;
public Humain() {
corps.add(new Cercle(200,200,26));
brasDroit=new Ligne(200,250,250,210);
corps.add(brasDroit);
brasGauche=new Ligne(200,250,150,210);
corps.add(brasGauche);
cuisseDroite = new Ligne(200,300,215,340);
corps.add(cuisseDroite);
cuisseGauche=new Ligne(200,300,185,340);
corps.add(cuisseGauche);
tibiaDroit=new Ligne(215,340,230,380);
corps.add(tibiaDroit);
tibiaGauche=new Ligne(185,340,170,380);
corps.add(tibiaGauche);
}
public void dessiner(Graphics g)
{ Forme enCours;
Iterator iterateur=corps.iterator();
while (iterateur.hasNext())
{ enCours=(Forme)iterateur.next();
enCours.dessiner(g);
}
}
public void deplacer(int dx, int dy)
{ Forme enCours;
Iterator iterateur=corps.iterator();
while (iterateur.hasNext())
{ enCours=(Forme)iterateur.next();
enCours.deplacer(dx,dy);
}
}
public void deplacer(Point vecteur)
{ Forme enCours;
Iterator iterateur=corps.iterator();
while (iterateur.hasNext())
{ enCours=(Forme)iterateur.next();
enCours.deplacer(vecteur);
}
}
public void flechir()
{ cuisseDroite.deplacerFin(new Point(15,0));
cuisseGauche.deplacerFin(new Point(-15,0));
tibiaDroit.deplacerDebut(new Point(15,0));
tibiaGauche.deplacerDebut(new Point(-15,0));
brasDroit.deplacerFin(new Point(0,80));
brasGauche.deplacerFin(new Point(0,80));
}
public void etendre()
{ cuisseDroite.deplacerFin(new Point(-15,0));
Didier Petitjean
4
// Tete
// Bras
// Jambes
17/04/2017
IUT Colmar TP3 : Abstraction/Polymorphisme
cuisseGauche.deplacerFin(new Point(15,0));
tibiaDroit.deplacerDebut(new Point(-15,0));
tibiaGauche.deplacerDebut(new Point(15,0));
brasDroit.deplacerFin(new Point(0,-80));
brasGauche.deplacerFin(new Point(0,-80));
}
}
/* Homme.java
* Classe dérivant de humain représentant un homme
* Didier Petitjean : 09/08/2006 */
package TP3;
public class Homme extends Humain{
public Homme() {
corps.add(new Ligne(174,174,226,174));
corps.add(new Rectangle(185,150,215,174));
corps.add(new Ligne(200,226,200,300));
}
}
// Chapeau
// Corps
/* Femme.java
* Classe dérivant de humain représentant une femme
* Didier Petitjean : 09/08/2006 */
package TP3;
public class Femme extends Humain{
public Femme()
{ corps.add(new Ligne(200,226,200,246));
// Corps
corps.add(new Ligne(200,246,170,300));
// Robe
corps.add(new Ligne(170,300,230,300));
corps.add(new Ligne(230,300,200,246));
}
}
/* * Defini le contenu de la fenêtre de l'application d'animation du visage. Lorsqu'il se réaffiche
* l'objet Dessin redessinne l'objet contenu dans cette liste. */
package TP3;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
public class Dessin extends Canvas {
private Dimension offDimension;
private Image offImage;
private Graphics offGraphics = null;
private Forme maForme=null;
private Collection compagnie = new ArrayList();
public int getLargeur() {
return getWidth();
}
public int getHauteur() {
return getHeight();
}
/** ajoute une forme à la zone de dessin. */
public void ajouterObjet(int sorte) {
switch (sorte)
{ case 0 : maForme=new Cercle();break;
case 1 : maForme=new Rectangle();break;
case 2 : compagnie.add(new Homme());break;
case 3 : compagnie.add(new Femme());break;
default : System.out.println("Forme n'existe pas");
Didier Petitjean
5
17/04/2017
IUT Colmar TP3 : Abstraction/Polymorphisme
}
repaint();
}
/** Permet le déplacement de l'objet en dx,dy ou vecteur*/
public void deplacer(int dx,int dy)
{ Forme enCours;
Iterator iterateur=compagnie.iterator();
while (iterateur.hasNext())
{ enCours=(Forme)iterateur.next();
enCours.deplacer(dx,dy);
}
if(maForme!=null)
maForme.deplacer(dx,dy);
}
public void deplacer(Point vecteur)
{ Forme enCours;
Iterator iterateur=compagnie.iterator();
while (iterateur.hasNext())
{ enCours=(Forme)iterateur.next();
enCours.deplacer(vecteur);
}
if(maForme!=null)
maForme.deplacer(vecteur);
}
public void flechir()
{ Humain enCours;
Iterator iterateur=compagnie.iterator();
while (iterateur.hasNext())
{ enCours=(Humain)iterateur.next();
enCours.flechir();
}
}
public void etendre()
{ Humain enCours;
Iterator iterateur=compagnie.iterator();
while (iterateur.hasNext())
{ enCours=(Humain)iterateur.next();
enCours.etendre();
}
}
/**temporisation de l'animation. */
public void pause(int durée) {
try {
Thread.currentThread().sleep(durée);
} catch (Exception e) {}
}
/**rafraichissement de la zone de dessin. Lorsque cette méthode est
* invoquée, la zone de dessin se réaffiche. */
public void update(Graphics g) {
Dimension d = getSize();
Humain enCours;
Iterator iterateur=compagnie.iterator();
if ((offGraphics == null) || (d.width != offDimension.width) || (d.height != offDimension.height)) {
offDimension = d;
offImage = createImage(d.width, d.height);
offGraphics = offImage.getGraphics();
}
offGraphics.setColor(getBackground());
offGraphics.fillRect(0, 0, d.width, d.height);
Didier Petitjean
6
17/04/2017
IUT Colmar TP3 : Abstraction/Polymorphisme
offGraphics.setColor(getForeground());
if(maForme!=null)
maForme.dessiner(offGraphics);
while (iterateur.hasNext())
{ enCours=(Humain)iterateur.next();
enCours.dessiner(offGraphics);
}
g.drawImage(offImage, 0, 0, this);
}
} // Dessin
/**
* Animation d'une compagnie d'hommes dans une fenêtre graphique.
* Les hommes sont dessinés à l'intérieur d'une fenêtre et font de la gym.
* Didier Petitjean : 10/08/2006
*/
package TP3;
import java.awt.Frame;
public class AppliForme {
public static void main(String[] args) {
int compteur=0;
// Création de la fenêtre graphique
Frame laFenetre = new Frame("Forme animée");
laFenetre.setSize(500,420);
// Création de la zone de dessin et la place dans la fenêtre
Dessin zoneDessin = new Dessin();
laFenetre.add(zoneDessin);
// Rajout d'homme et de femme dans la zone de dessin
zoneDessin.ajouterObjet(2); //homme
zoneDessin.deplacer(100,0);
zoneDessin.ajouterObjet(3); //femme
zoneDessin.deplacer(100,0);
zoneDessin.ajouterObjet(2); //homme
// Affichage de la fenêtre
laFenetre.show();
// Pour simplifier, l'animation s'affiche n fois
while (compteur<50)
{ if((compteur%2)==0)
zoneDessin.flechir();
else
zoneDessin.etendre();
zoneDessin.repaint();
// un temps de pause pour avoir le temps de voir le nouveau dessin
zoneDessin.pause(500);
compteur++;
}
}
} // AppliForme
Didier Petitjean
7
17/04/2017
Téléchargement