copyright © 2001 laurent deruelle1 le graphisme avec java 2d laurent deruelle...
TRANSCRIPT
Copyright © 2001 Laurent Deruelle 2
L ’API JAVA2D
• API JAVA2D– capacités graphiques avancées en deux
dimensions– graphismes, images, et textes 2D– extension java.awt et remplacement des classes
de base
Copyright © 2001 Laurent Deruelle 3
L ’API JAVA2D
• Caractéristiques Java2D :– structure de remplissage (dégradés, motifs)– personnaliser la largeur et le style d ’un trait– anticrénelage pour lisser les bords d ’objets
dessinés
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
Copyright © 2001 Laurent Deruelle 4
Espace de Coordonnées
• Zone en 2D pouvant être décrite à l ’aide de coordonnées x, y.
• (0,0) est le coin supérieur gauche de la surface
• coordonnées utilisateur coordonnées périphériques (fenêtre, imprimante, etc)
=> translation, rotation, etc.• conversions automatiques durant le rendu
Copyright © 2001 Laurent Deruelle 5
La Classe Graphics2D
• La classe java.awt.Graphics2D étend la classe java.awt.Graphics.
• Pour utiliser Java2D, il faut transformer l ’objet Graphics en un objet Graphics2D :
public void paintComponent (Graphics g) { Graphics2D g2D = (Graphics2D) g; ...
}
Copyright © 2001 Laurent Deruelle 6
Le Rendu
• Spécifier comment un objet sera dessiné dans la surface d ’affichage
• attributs pour le rendu :– couleur– largeur de ligne– motifs de remplissage– transparence– etc.
Copyright © 2001 Laurent Deruelle 7
Exemple de Rendus
• Le style Trait :
setStroke()
• Le style Remplissage :
setPaint()
• Le style Composition :
setComposite()
Copyright © 2001 Laurent Deruelle 8
Exemple de Rendus
• Le style Transformation :
setTransform()
• Le style Clip :
setClip()
• le style Anticrénelage :
setRenderingHints()
Copyright © 2001 Laurent Deruelle 9
Les couleurs 2D
• On spécifie les couleurs à l ’aide de la méthode setColor(Color c)
• Exemple:
g2D.setColor(Color.black);
Copyright © 2001 Laurent Deruelle 10
Motifs de Remplissage
• Les motifs contrôlent la manière dont un objet dessiné est rempli.– couleur unie– dégradé– texture– motif personnalisé
Copyright © 2001 Laurent Deruelle 11
Motifs de Remplissage
• Le motif se définit avec la méthode setPaint(Paint paint);
• L ’interface Paint peut être implémentée pour définir un motif de remplissage
• Exemple:– GradientPaint– TexturePaint– Color :couleur unie
Copyright © 2001 Laurent Deruelle 12
La classe GradientPaint
• Le gradient permet de définir un dégradé de couleur:– acyclique (linéaire)– cyclique (à répétition: indiquer true au constructeur
de GradientPaint)
• Exemple :GradientPaint(x1, y1, Color.black,
x2, y2, Color.white, true);
Copyright © 2001 Laurent Deruelle 13
La classe GradientPaint
Copyright © 2001 Laurent Deruelle 14
La classe TexturePaint
• Elle permet de remplir une forme à l ’aide d ’une image, spécifié en tant que BufferedImage.
• Exemple :TexturePaint(image, rectangle)
– rectangle est utilisé pour spécifier la taille de l ’image et sa fréquence de répétition
Copyright © 2001 Laurent Deruelle 15
La classe TexturePaint
Copyright © 2001 Laurent Deruelle 16
Le type Trait
• En awt classique, toutes les lignes mesurent 1 pixel de large.
• En Java2D, la largeur varie en utilisant la méthode setStroke(Stroke s).
• L ’interface Stroke est implémentée uniquement par BasicStroke.
Copyright © 2001 Laurent Deruelle 17
La classe BasicStroke
• Il décrit le rendu d ’une forme faite au crayon.
• BasicStroke(float largeur, int ornement, int jonction)
Copyright © 2001 Laurent Deruelle 18
L ’Ornement
• ornement est– BasicStroke.CAP_BUTT : carré– BasicStroke.CAP_ROUND : arrondi– BasicStroke.CAP_SQUARE : carré plus long
Copyright © 2001 Laurent Deruelle 19
La Jonction
• La jonction est :– BasicStroke.JOIN_MITER : joint les segments
en étendant leurs bords externes– BasicStroke.JOIN_ROUND : arrondi l ’angle
formé entre deux ségments– BasicStroke.JOIN_BEVEL : joint les ségments
par une ligne droite
Copyright © 2001 Laurent Deruelle 20
Le Clipping• Le clipping consiste à définir une zone d ’affichage.
Toutes formes hors de cette zone ne sera pas affiché.• Exemple :• Ellipse2D ellipse = new Ellipse2D.Float();• Rectangle2D rect = new Rectangle2D.Float();• ...• ellipse.setFrame(x, y, ew, eh);• g2.setClip(ellipse); //définit la zone de clipping• rect.setRect(x+5, y+5, ew-10, eh-10);• g2.clip(rect); //la zone finale est l ’intersection de l ’ellipse et du
rectangle
Copyright © 2001 Laurent Deruelle 21
Le Clipping
Copyright © 2001 Laurent Deruelle 22
Le Compositing
• Le compositing permet de mélanger les couleurs de plusieurs formes
• Il permet de gérer la transparence en spécifiant une valeur alpha.
• La valeur alpha spécifie le degré de transparence – 1.0 totalement opaque– 0.0 totalement transparent
Copyright © 2001 Laurent Deruelle 23
Le Compositingac = AlphaComposite.getInstance(getRule(rule), alpha);
public int getRule(int rule){
int alphaComp = 0;
switch ( rule ) {
case 0: alphaComp = AlphaComposite.SRC; break;
case 1: alphaComp = AlphaComposite.DST_IN; break;
case 2: alphaComp = AlphaComposite.DST_OUT; break;
case 3: alphaComp = AlphaComposite.DST_OVER; break;
case 4: alphaComp = AlphaComposite.SRC_IN; break;
case 5: alphaComp = AlphaComposite.SRC_OVER; break;
case 6: alphaComp = AlphaComposite.SRC_OUT; break;
case 7: alphaComp = AlphaComposite.CLEAR; break; }
return alphaComp;
}
Copyright © 2001 Laurent Deruelle 24
Le Compositing
public void paintComponent(Graphics g) {
super.paintComponent( g );
Graphics2D g2 = (Graphics2D) g;
BufferedImage buffImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D gbi = buffImg.createGraphics();
// effacer a surface.
g2.setColor(Color.white);
g2.fillRect(0, 0, d.width, d.height);
int rectx = w/4;
int recty = h/4;
Copyright © 2001 Laurent Deruelle 25
Le Compositing
// Draws the rectangle and ellipse into the buffered image.
gbi.setColor(new Color(0.0f, 0.0f, 1.0f, 1.0f));
gbi.fill(new Rectangle2D.Double(rectx, recty, 150, 100));
gbi.setColor(new Color(1.0f, 0.0f, 0.0f, 1.0f));
gbi.setComposite(ac);
gbi.fill(new Ellipse2D.Double(rectx+rectx/2,recty+recty/2,150,100));
// Draws the buffered image.
g2.drawImage(buffImg, null, 0, 0);
}
Copyright © 2001 Laurent Deruelle 26
Le Compositing
Copyright © 2001 Laurent Deruelle 27
Les Formes Java2D
• Lorsque les attributs et le style de rendu de l ’objet Graphics2D sont réalisés :– créer l ’objet – dessiner l ’objet
Copyright © 2001 Laurent Deruelle 28
Les Formes Java2D
• les objets sont des formes géométriques (java.awt.geom) :– Line2D– Rectangle2D– Ellipse2D– Arc2D– GeneralPath (polygone)
Copyright © 2001 Laurent Deruelle 29
Les Lignes 2D
• Les lignes sont créées à l ’aide de la classe Line2D.Float
• Exemple :Line2D.Float ligne = new Line2D.Float(60f, 5f, 13f, 28f);
Copyright © 2001 Laurent Deruelle 30
Les Rectangles 2D• Les rectangles sont créés à l ’aide des classes
Rectangle2D.Float ou RoundRectangle2D.Double
• Les paramètres du constructeur sont le point (x,y) de départ, puis la largeur et la hauteur.
• Exemple:Rectangle2D.Float(10f, 13f, 40f, 20f)
RoundRectangle2D.Float(10f, 13f, 40f, 20f,
largeurarc, hauteurarc)
Copyright © 2001 Laurent Deruelle 31
Les Ellipses 2D
• Les objets ovales sont appelés ellipses en Java2D.
• Ils sont créés à l ’aide de la classe Ellipse2D.Float
• les paramètres sont le point de départ, puis la largeur et la hauteur
• Exemple :– Ellipse2D.Float(113, 25, 22, 40)
Copyright © 2001 Laurent Deruelle 32
Les Arcs 2D
• Les arcs de cercle en Java2D sont créés à l ’aide de la classe Arc2D.Float
• les quatre premiers paramètres indiquent les coordonées x,y, largeur et hauteur.
• Les trois derniers sont le degré de départ de l ’arc, le nombre de degré qu ’il parcourt, et un entier décrivant comment il se ferme (Arc2D.OPEN: non fermé, Arc2D.CHORD: ligne droite, Arc2D.PIE: vers le centre)
Copyright © 2001 Laurent Deruelle 33
Les Polygones
• Les polygones sont créés en définissant chaque mouvement d ’un point à un autre.
• Les polygones sont définis à l ’aide d ’un objet GeneralPath.
• La méthode moveTo(x, y), permet de créer le premier point du polygone.
Copyright © 2001 Laurent Deruelle 34
Les Polygones
• Les méthodes lineTo(x, y) permet de relier le point courant à un autre.
• La méthode closePath() permet de fermer le polygone.
• Exemple :– GeneralPath poly = new GeneralPath();– poly.moveTo(10f, 10f); poly.lineTo(55f, 55f);– poly.closePath();
Copyright © 2001 Laurent Deruelle 35
Le texte en 2D
• Le texte est dessiné à l ’aide la méthode drawString(chaine, x, y)
• Exemple :– g2D.drawString(’’Bonjour ’’, 10f, 20f);
Copyright © 2001 Laurent Deruelle 36
Les Images
• Java2D implémente un nouveau modèle pour la manipulation d ’images.
• Exemple :Image image =
Toolkit.getDefaultToolkit().getImage(’’img.gif’’);
g2.drawImage(image, x, y, largeur, hauteur, this);
Supposer un - Jpanel -JFrame
Copyright © 2001 Laurent Deruelle 37
Les Images
int iw = image.getWidth(this);
int ih = image.getHeight(this);
bi = new BufferedImage(iw, ih,
BufferedImage.TYPE_INT_RGB);
Graphics2D big = bi[i].createGraphics();
big.drawImage(image,0,0,this);
Copyright © 2001 Laurent Deruelle 38
Dessiner les objets
• Tous les objets dessinés utilisent les mêmes méthodes de la classe Graphics2D :– draw(Shape s) pour les contours,– fill(Shape s) pour les objets remplis,– drawImage(BufferedImage)
• Définir les couleurs– setBackground(Color.black);– setForeground(Color.white);
Copyright © 2001 Laurent Deruelle 39
Les Transformations Graphics2D• L ’objet Graphics2D peut appliquer des
opérations sur la surface d ’affichage :– scale(x, y) pour mettre à l ’echelle (<1)– rotate (theta) effectue une rotation– rotate (theta, x , y) effectue une rotation et une
translation– translate (double x, double y) effectue une
translation– translate (int x, int y) modifie l ’origine de la surface