package linea; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique // Ne pas oublier qu'il y a des propriétés et méthodes reçues par l'héritage //------------------------------------------------------------------------- // PROPRIETES //------------------------------------------------------------------------- protected double vitesseDefilement = 5.0; // nb de Segments qui composent la ligne protected int nbSegments = 400; // amplitude maximale de l'inclinaison verticale des segments (dy) protected double inclinaisonMax = 30.0; // position du cercle, pour déterminer quel est le segment courant protected double xCercle = 400; // à modifier // segment qui se trouve au niveau du cercle : on le mémorise pour accélérer les traitements protected Segment SegCourant; protected ArrayList listSegments = new ArrayList(); //------------------------------------------------------------------------- // METHODES //------------------------------------------------------------------------- //------------------------------------------------------------------------- // Constructeur de la classe //------------------------------------------------------------------------- public Ligne() { // Par défaut, si on ne précise rien, on met vitesse 5 et pente 30 this(5.0, 30.0); } public Ligne(double vitesse, double penteMax) { this.vitesseDefilement = vitesse; this.inclinaisonMax = penteMax; double x = 400; double y = 200; double dx = 0, dy = 0; Segment s = new Segment(x, y, dx, dy); listSegments.add(s); for (int i=1; i 600) { dy = -dy; } s = new Segment(x,y,dx,dy); s.setCouleur(new Color(0.2f,0.2f,0.2f)); x+=dx; y+=dy; listSegments.add(s); } } public void setInclinaisonMax(double valeur) { if (valeur < 0) valeur = -valeur; this.inclinaisonMax = valeur; } public double getInclinaisonMax() { return this.inclinaisonMax; } //------------------------------------------------------------------------- // Redéfinition de la méthode Afficher, spécifiquement pour la classe Ligne //------------------------------------------------------------------------- @Override public void Afficher(Graphics g){ // On définit l'épaisseur du trait Graphics2D g2D = (Graphics2D) g; g2D.setStroke(new BasicStroke(3.0f)); for(Segment s : listSegments){ s.Afficher(g); } } //------------------------------------------------------------------------- // Redéfinition de la méthode Animer, spécifiquement pour la classe Ligne //------------------------------------------------------------------------- @Override void Animer() { this.x -= vitesseDefilement; for (Segment s : listSegments) { s.setX(s.getX() - vitesseDefilement); } } public double getHauteurLigneA(double xCercle) { for (Segment s : listSegments) { // Si le segment couvre la position X du cercle if (xCercle >= s.getX() && xCercle <= (s.getX() + s.xLong)) { // Calcul de l'interpolation linéaire pour trouver le Y exact sur le segment double ratio = (xCercle - s.getX()) / s.xLong; return s.getY() + (ratio * s.yLong); } } return -1; // Hors de la ligne } }