Files
Projet_DEV/src/linea/Ligne.java

125 lines
3.4 KiB
Java
Raw Normal View History

2026-02-03 13:50:27 +01:00
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;
2026-02-03 13:50:27 +01:00
// nb de Segments qui composent la ligne
protected int nbSegments = 400;
2026-02-23 09:17:36 +01:00
// amplitude maximale de l'inclinaison verticale des segments (dy)
protected double inclinaisonMax = 30.0;
2026-02-03 13:50:27 +01:00
// 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<Segment> listSegments = new ArrayList<Segment>();
//-------------------------------------------------------------------------
// 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);
}
2026-02-03 15:36:11 +01:00
public Ligne(double vitesse, double penteMax) {
this.vitesseDefilement = vitesse;
this.inclinaisonMax = penteMax;
2026-02-03 15:36:11 +01:00
double x = 400;
double y = 200;
double dx = 0, dy = 0;
2026-02-03 15:36:11 +01:00
Segment s = new Segment(x, y, dx, dy);
listSegments.add(s);
2026-02-03 15:36:11 +01:00
for (int i=1; i<nbSegments; i++) {
2026-02-03 15:36:11 +01:00
dx = (Math.random()*20)+80;
2026-02-23 09:17:36 +01:00
dy = (Math.random() * (2.0 * inclinaisonMax)) - inclinaisonMax;
2026-02-16 19:04:07 +01:00
if (y + dy < 0 || y + dy > 600) {
dy = -dy;
}
2026-02-03 13:50:27 +01:00
s = new Segment(x,y,dx,dy);
s.setCouleur(new Color(0.2f,0.2f,0.2f));
2026-02-03 13:50:27 +01:00
x+=dx;
y+=dy;
2026-02-03 15:36:11 +01:00
listSegments.add(s);
2026-02-03 13:50:27 +01:00
}
}
2026-02-23 09:19:11 +01:00
2026-02-23 09:17:36 +01:00
public void setInclinaisonMax(double valeur) {
if (valeur < 0) valeur = -valeur;
this.inclinaisonMax = valeur;
}
public double getInclinaisonMax() {
return this.inclinaisonMax;
}
2026-02-03 13:50:27 +01:00
//-------------------------------------------------------------------------
// 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
2026-02-03 15:36:11 +01:00
void Animer() {
this.x -= vitesseDefilement;
for (Segment s : listSegments) {
s.setX(s.getX() - vitesseDefilement);
}
2026-02-03 13:50:27 +01:00
}
2026-02-03 15:45:52 +01:00
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
}
2026-02-03 13:50:27 +01:00
}