ProgLib : Turtle_Graphics

Transcription

ProgLib : Turtle_Graphics
Jacques BAPST
Date : 2 juillet 2015
PROGLIB – TURTLE GRAPHICS
INTRODUCTION
La librairie ProgLib contient, entre autres, la classe TurtlePanel qui permet de créer et d'afficher à
l'écran des graphiques 2D simples sans avoir à connaître les aspects techniques liés à la programmation
graphique sur la plateforme Java.
Le tracé du graphique s'effectue en créant un panneau de dessin (TurtlePanel) qui contient un élément
mobile (appelé tortue) que l'on peut déplacer et qui, selon son état, laisse une trace derrière lui.
SYSTÈME DE COORDONNÉES
L'origine du système de coordonnées est située en haut, à gauche de la surface rectangulaire de dessin.
La taille de cette surface de dessin est définie lors de la création de la fenêtre graphique (TurtlePanel).
Durant l'exécution de l'application, l'utilisateur peut redimensionner cette fenêtre.
[ 0,0 ]
x
Tortue
(élément virtuel,
non visible)
y
Lors de la création de la fenêtre graphique, on peut définir la position initiale de la tortue. A l'origine elle
est orientée vers la droite (direction des valeurs croissante de l'axe x). Les fonctions setAbsPos(),
advance() et reset() modifient la position courante de la tortue.
Par défaut, l'unité de traçage est le pixel. La fonction scale() permet de changer d'échelle et de modifier
ainsi les unités sur les axes x et y. Des translations (translate()) et rotations (rotate()) peuvent
également être effectuées sur le contexte graphique du dessin.
UTILISATION
La première étape consiste à créer un panneau graphique de type TurtlePanel en invoquant la
méthode statique create() de la classe TurtlePanel. Exemple d'utilisation :
TurtlePanel t = TurtlePanel.create("Test", 600, 500, 40, 20, true);
Paramètres :
String
int
int
float
float
boolean
title
width
height
initX
initY
exitOnClose
:
:
:
:
:
:
Titre de la fenêtre (Frame) dans laquelle sera affiché le graphique
Largeur (en pixel) de la fenêtre
Hauteur (en pixel) de la fenêtre
Position initiale (en pixel) de la tortue selon l'axe x
Position initiale (en pixel) de la tortue selon l'axe y
Arrête l'application lorsqu'on ferme la fenêtre graphique
Il est possible ensuite de manipuler la tortue et son environnement en invoquant les méthodes de l'objet t
qui représente la surface de dessin (panneau graphique), qui mémorise son état et qui offre différentes
fonctions décrites plus en détail dans les sections suivantes.
ProgLib_Turtle_Graphics.docx
HEIA-FR / Jacques BAPST
1
Fonctions de base
void setAbsPos(float x, float y)
 Définit une nouvelle position (absolue) pour la tortue (sans dessiner).
void setAbsOrientation(float angle)
 Définit l'orientation (absolue) de la tortue. L'angle est en degré (0 correspond à l'orientation de l'axe x,
un nombre positif définit un angle dans le sens antihoraire).
void setPenColor(Color penColor)
 Définit la couleur courante de la plume (la classe Color se trouve dans le package java.awt).
void setPenSize(float penSize)
 Définit l'épaisseur de la plume. Si l'on n'a pas défini de transformation d'échelle, l'unité est le pixel. La
valeur 0.0f correspond à la ligne la plus fine possible.
void penUp()
void penDown()
 Soulève ou abaisse la plume (suppression ou reprise du tracé). A l'état initial, la plume est abaissée.
void advance(float distance)
 Avance la tortue de la distance mentionnée selon l'orientation courante (si la distance est négative, la
tortue recule). Si l'on n'a pas défini de transformation d'échelle, l'unité est le pixel.
void
void
void
void
turnLeft()
turnLeft(float angle)
turnRight()
turnRight(float angle)
 Tourne à gauche ou à droite de 90° ou d'un angle donné en paramètre (en degré)
void setBackground(Color bgColor)
 Définit la couleur de fond du panneau graphique (la classe Color se trouve dans le package java.awt).
 Tout ce qui a déjà été dessiné sera effacé. Par défaut, le fond est blanc.
void setAutoRepaint(boolean autoRepaint)
void repaint()
 Définit le mode de rafraîchissement du graphique. Si autoRepaint est true, le dessin est mis à jour
après chaque opération si autoRepaint est false, il faut explicitement appeler repaint() pour
rafraichir l'état du tracé. Par défaut, le rafraîchissement automatique est enclenché.
 Le travail avec setAutoRepaint(false) permet d'accélérer le temps de traitement dans le cas où il y
a un très grand nombre d'opérations graphiques (courbes complexes, etc.) et que les affichages
intermédiaires ne sont pas nécessaires.
void setPenPattern(int pattern)
 Définit le style de ligne du tracé. La taille et l'espacement des motifs dépendent de l'épaisseur de la
plume (Pen-Size).
 Les valeurs possibles sont : PLAIN
: Ligne continue (valeur par défaut)
DOTTED
DASHED
DASHED_DOTTED
ProgLib_Turtle_Graphics.docx
: Ligne pointillée
: Ligne traitillée
: Ligne de type trait-point-trait-point-...
HEIA-FR / Jacques BAPST
2
void clear()
void erase(float x, float y, float width, float height)
 Efface toute la surface de dessin ou une surface rectangulaire donnée. La position de la tortue reste
inchangée.
void reset()
 Efface toute la surface de dessin et remet la tortue dans sa position et son orientation initiale.
Écriture de texte
void mark(String s, int fontSize)
 Écrit un texte à la position actuelle (le texte est centré autour de la position x courante et positionné
légèrement au-dessus de la position y courante). La taille du texte est définie en points. La police
utilisée est une police sans empattements.
Rectangle2D drawText(String s, int fontSize, float x, float y)
Rectangle2D drawText(String s, Font font,
float x, float y)
 Écrit un texte à la position x, y (position du début de la ligne de base). Il est possible de définir la taille
de la police (en points) ou de donner un objet de type Font qui définit la police, le style et la taille (la
classe Font est définie dans le package java.awt).
 La méthode retourne le rectangle (package java.awt.geom) qui englobe le texte (Bounding-Box).
Tracé de formes
void drawCurve(float fromX, float fromY,
float ctrlX, float ctrlY, float toX, float toY)
 Trace une courbe de Bezier (quadratique) d'un point de départ à un point d'arrivée avec un point de
contrôle qui définit la courbure ainsi que les orientations (tangentes) au départ et à l'arrivée.
void drawCircle(float radius, boolean filled)
void drawCircle(float centerX, float centerY, float radius, boolean filled)
 Trace un cercle à la position courante ou à une position donnée (centre). Le paramètre filled définit
s'il faut remplir la surface ou tracer uniquement le contour du cercle.
void drawEllipse(float centerX, float centerY,
float width,
float height, boolean filled)
 Trace une ellipse d'une certaine largeur et hauteur à une position donnée (centre). Le paramètre
filled définit s'il faut remplir la surface ou tracer uniquement le contour de l'ellipse.
void drawRectangle(float width,
float height,
boolean filled)
void drawRectangle(float upperLeftX, float upperLeftY,
float width,
float height,
boolean filled)
 Trace un rectangle d'une certaine hauteur et largeur et dont le centre se trouve à la position courante
ou en donnant les coordonnées du coin supérieur gauche. Le paramètre filled définit s'il faut remplir
la surface ou tracer uniquement le contour du rectangle.
Fonctions de consultations (getters)
float
float
float
float
getXPos()
getYPos()
getOrientation()
getPenSize()
int
int
Color
int
getPanelWidth()
getPanelHeight()
getPenColor()
getPenPattern()
boolean getPaintMode()
Color
getBackground()
 Fonctions de consultation permettant de connaître l'état courant du contexte graphique : position (x, y)
et orientation courante de la tortue, taille et couleur de la plume, couleur d'arrière-plan, style de ligne,
mode de rafraichissement et taille actuelle (en pixels) de la fenêtre graphique.
ProgLib_Turtle_Graphics.docx
HEIA-FR / Jacques BAPST
3
Transformations
void translate(float dx, float dy)
 Translation du contexte graphique en x et y. Des valeurs positives déplacent les coordonnées actuelles
x et y en direction des valeurs croissantes (autrement dit vers la droite et vers le bas).
 L'appel de cette méthode n'influence pas ce qui est déjà dessiné mais affectera la suite du tracé.
void scale(float scaleFactor)
void scale(float xScaleFactor, float yScaleFactor)
 Modifie l'échelle du contexte graphique en donnant un facteur global (appliqué sur les deux axes) ou en
appliquant des facteurs distincts sur chacun des axes. Le facteur est appliqué à partir de l'origine [0, 0]
et a un effet sur tous les éléments dessinés (position, épaisseur des traits, grandeur des textes, etc.).
 L'appel de cette méthode n'influence pas ce qui est déjà dessiné mais affectera la suite du tracé.
 Attention : les appels à cette méthodes sont multiplicatifs (appeler deux fois scale(3) correspond à un
appel à scale(9)).
void rotate(float angle)
void rotate(float angle, float rx, float ry)
 Rotation du contexte graphique autour de l'origine [0, 0] ou d'un autre centre de rotation [rx, ry]. Une
valeur positive de l'angle (exprimée en degré) indique une rotation dans le sens antihoraire.
 L'appel de cette méthode n'influence pas ce qui est déjà dessiné mais affectera la suite du tracé.
Autres fonctions
BufferedImage cloneCurrentImage()
BufferedImage cloneCurrentImage(int fromX, int fromY, int width, int height)
 Retourne une copie de l'image interne du graphique ou d'une partie de celle-ci (en donnant les
coordonnées du coin supérieur gauche ainsi que la largeur et la auteur définissant la région à copier).
 Permet de mémoriser un état du graphique (ou d'une partie de celui-ci) et de le restituer ultérieurement,
éventuellement à un autre endroit, avec la méthode pasteImage().
void pasteImage(BufferedImage image, int x, int y)
 Insère dans le graphique une image (de type BufferedImage) à une position donnée (position du coin
supérieur gauche de l'image).
void saveImage(String format, String fileName)
 Crée un fichier sur disque avec l'image actuelle.
 Le paramètre format peut prendre les valeurs "png", "jpg", "gif" ou "bmp".
 Le nom du fichier fileName comprend généralement le chemin d'accès absolu ou relatif, par exemple :
"D:/Temp/Graph.png" (remarque : le forward slash '/'est autorisé indépendamment de la plateforme).
void drawGrid(double fromX, double toX, double xInterval,
double fromY, double toY, double yInterval)
 Dessine une grille entre les valeurs minimales et maximales fournies et avec un intervalle donné.
 La grille est dessinée en vert (avec la ligne la plus fine possible). Les deux axes passant par l'origine
sont dessinés en orange.
ProgLib_Turtle_Graphics.docx
HEIA-FR / Jacques BAPST
4
EXEMPLE D'UTILISATION
package test.turtle;
import proglib.*;
import java.awt.Color;
import java.awt.Font;
public class TestTurtleGraphics {
public static void main(String[] args) {
TurtlePanel t = TurtlePanel.create("Turtle", 300, 200, 20, 180, true);
//--- Axes
t.setPenSize(2);
t.advance(260);
t.setAbsPos(25, 185);
t.turnLeft();
t.advance(170);
//--- Escaliers
t.setAbsPos(40, 170);
t.setAbsOrientation(90);
t.setPenSize(0.5f);
t.setPenColor(Color.RED);
for (int i=1; i<10; i++) {
t.advance(15);
t.turnRight();
t.advance(15);
t.turnLeft();
}
//--- Rectangles
t.setPenSize(1);
t.setPenColor(Color.BLUE);
t.drawRectangle(200, 70, 25, 110, true);
t.drawRectangle(240, 110, 25, 70, true);
//--- Cercles concentriques
t.setPenSize(4);
t.setPenColor(Color.LIGHT_GRAY);
t.drawCircle(250, 40, 8, true);
t.setPenColor(Color.YELLOW);
t.drawCircle(250, 40, 16, false);
//--- Titre
t.setPenColor(new Color(180, 50, 50));
t.setAbsPos(90, 30);
t.mark("Test Turtle", 20);
//--- Texte oblique
t.setPenColor(Color.RED);
t.drawText("Angle 45°", new Font("SanSerif", Font.PLAIN, 12), 100, 140, 45f);
//--- Save graphics to png file
t.saveImage("png", "D:/TestTurtle/Graphics.png");
}
}
ProgLib_Turtle_Graphics.docx
HEIA-FR / Jacques BAPST
5
REMARQUES
 Lors du redimensionnement de la fenêtre par l'utilisateur, la taille de l'image interne du graphique est
automatiquement adaptée. Si la taille de la fenêtre est réduite puis agrandie à nouveau il est possible,
selon la taille de la fenêtre, qu'une partie du dessin ait été effacé et ne puisse pas être restitué.
 Un clic sur la zone de dessin permet de forcer un réaffichage ( repaint() ) de l'image interne (peut
éventuellement être utile en mode autoRepaint=false pour forcer des affichages intermédiaires).
 Il est possible, dans un programme, de créer plusieurs panneaux graphiques (TurtlePanel). Cependant,
si l'on ferme un panneau créé avec exitOnClose=true, tous les autres seront également fermés.
ProgLib_Turtle_Graphics.docx
HEIA-FR / Jacques BAPST
6

Documents pareils