package pg.coursjava.logo;
import java.awt.* ;
import java.awt.event.* ;
/**
*
* Un objet de cette classe définit une plume pour dessiner dans une "fenêtre Logo".
*
* @author Philippe Genoud d'après Laurent Mounier
* @version 16 février 1999
*/
public class Plume {
// etat de la plume
private Pt ptCour = new Pt(0.0,0.0); // position courante de la plume
private Pt ptSuiv = new Pt(0.0,0.0); // position suivante de la plume
// utilise lors des deplacements de la plume, mais declarée ici pour éviter de créer des points
// a chaque fois
private boolean plumeBasse=true ; // etat de la plume
private double plumeCap=0 ; // cap de la plume en degrés
private double plumeCapRad = 0.0; // cap de la plume en radians
private boolean visible = true; // visibilité de la plume, true par defaut
private Fenetre f;
/**
* création d'un objet Plume.
* @param f la fenêtre "Logo" dans laquelle la plume dessinera.
*/
Plume(Fenetre f)
{
this.f = f;
}
/**
* création d'un objet Plume.
* Attention, à sa création l'objet plume n'est associé à aucune fenêtre.
* Cette association se fera en passant l'objet plume en paramètre du constructeur
* de la fenêtre où la plume se dessinera.
* A sa création la plume est placée en (0.0 0.0), en position basse avec un cap de 0
* (sur axe des x positifs).
*/
public Plume()
{
}
/**
* associe une fenêtre à un objet plume.
* @param f la fenêtre "Logo" dans laquelle la plume dessinera.
*/
void setFenetre(Fenetre f)
{
this.f = f;
}
/**
* dessine la plume
*/
void dessineToi(Graphics g)
{
g.setColor(Color.green);
double xt = f.offsetX + Math.round(ptCour.x);
double yt = f.offsetY - Math.round(ptCour.y);
g.fillOval((int)(xt - 5), (int)(yt -5), 10,10);
g.drawLine((int)xt,(int)yt,
(int)(xt + Math.round(10 * Math.cos(plumeCapRad))),
(int)(yt - Math.round(10 * Math.sin(plumeCapRad))));
g.setColor(Color.black);
}
/**
* Avance la plume d'une distance de "l" selon le cap courant. Si la
* plume est basse, le segment correspondant au deplacement
* effectue est trace dans la fenetre.
* @param l longueur du deplacement
*/
public void avance (double l) {
ptSuiv.x = (ptCour.x + l * Math.cos(plumeCapRad)) ;
ptSuiv.y = (ptCour.y + l * Math.sin(plumeCapRad)) ;
if (plumeBasse)
f.afficheSegment(ptCour,ptSuiv);
ptCour.x = ptSuiv.x ; ptCour.y = ptSuiv.y ;
}
/**
* Ajoute "a" degre au cap courant de la plume
* (les angles sont orientes dans le sens trigonometrique).
* @param a la valeur (en degres) à ajouter au cap
*/
public void tourne (double a) {
plumeCap += a;
plumeCap = (int)plumeCap % 360 + (plumeCap - (int) plumeCap);
plumeCapRad = Math.PI * plumeCap/180.0; // cap en radians
f.repaint();
}
/**
* consulte la valeur du cap de la plume.
* @return Valeur en degrés du cap.
*/
public double getCap()
{
return plumeCap;
}
/**
* fixe la valeur du cap de la plume.
* @param v Valeur (en degrés) à affecter au cap.
*/
public void setCap(int v)
{
plumeCap = v;
plumeCapRad = Math.PI * plumeCap/180.0; // cap en radians
f.repaint();
}
/**
* fixe la valeur du cap de la plume.
* @param v Valeur (en degrés) à affecter au cap.
*/
public void setCap(double v)
{
plumeCap = v;
plumeCapRad = Math.PI * plumeCap/180.0; // cap en radians
f.repaint();
}
/**
* Leve la plume
*/
public void leve () {
plumeBasse = false ;
}
/**
* Baisse la plume
*/
public void baisse () {
plumeBasse = true ;
}
/**
* Positionne la plume sur un point donné.
* Si la plume est basse, le segment correspondant au deplacement
* effectue est trace dans la fenêtre.
* @param x abscisse du point où la plume est positionnée
* @param y ordonnée du point où la plume est positionnée
*/
public void positionne (double x, double y) {
ptSuiv.x = x; ptSuiv.y = y;
if (plumeBasse)
{
f.afficheSegment (ptCour, ptSuiv) ;
ptCour.x = ptSuiv.x ; ptCour.y = ptSuiv.y ;
}
else
{
ptCour.x = ptSuiv.x ; ptCour.y = ptSuiv.y ;
f.repaint();
}
}
/**
* Consultation de la position de la plume
* @return la position de la plume
*/
public Pt getPosition () {
return ptCour;
}
/**
* Consultation de l'etat de la plume (levŽe ou baissŽe).
* @return true si la plume est baissŽe, false si elle est levŽe
*/
public boolean plumeBasse()
{
return plumeBasse;
}
/**
* consultation de la visibilité ou non de la plume.
* @return true si la plume est visible, false sinon.
*/
public boolean estVisible()
{
return visible;
}
/**
* fixe la visibilité ou non de la plume.
* @param v true la plume sera visible, false la plume ne sera plus visible
*/
public void visible(boolean v)
{
visible = v;
f.repaint();
}
/**
* retourne une chaîne (String) représentant la plume
* @return la chaîne représentant la pluem.
* "je suis une Plume"
* "ma position : x = .. y =.."
* "mon cap : ..."
* "je suis levée" ou "je suis baissée"
*/
public String toString()
{
return "Je suis une Plume\n" +
"ma position : x = " + ptCour.x + " y = " + ptCour.y + "\n" +
"mon cap : " + plumeCap + "\n" +
"je suis " + ((plumeBasse)?"baissée\n":"levée\n");
}
}