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
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
// 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(){
|
|
|
|
|
// Valeurs initiales pour la position de la Ligne
|
2026-02-03 15:45:52 +01:00
|
|
|
double x = 400;
|
2026-02-03 13:50:27 +01:00
|
|
|
double y = 200;
|
2026-02-03 15:36:11 +01:00
|
|
|
|
|
|
|
|
double xCourant = x;
|
|
|
|
|
double yCourant = y;
|
|
|
|
|
double dx = 0,dy=0;
|
|
|
|
|
|
2026-02-03 13:50:27 +01:00
|
|
|
|
|
|
|
|
// Création de la liste de segments qui composent la ligne
|
2026-02-03 15:36:11 +01:00
|
|
|
Segment s = new Segment(xCourant,yCourant,dx,dy);
|
|
|
|
|
|
|
|
|
|
|
2026-02-03 13:50:27 +01:00
|
|
|
for (int i=0; i<nbSegments; i++){
|
|
|
|
|
// définition d'un nouveau segment
|
2026-02-03 15:36:11 +01:00
|
|
|
dx = (Math.random()*20)+80;
|
2026-02-23 09:17:36 +01:00
|
|
|
// dy aléatoire dans [-inclinaisonMax, +inclinaisonMax]
|
|
|
|
|
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));
|
|
|
|
|
|
|
|
|
|
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:17:36 +01:00
|
|
|
/**
|
|
|
|
|
* Définit l'amplitude maximale d'inclinaison (valeur positive).
|
|
|
|
|
* Les segments auront un dy dans [-inclinaisonMax, +inclinaisonMax].
|
|
|
|
|
*/
|
|
|
|
|
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() {
|
|
|
|
|
// On déplace chaque segment vers la gauche (vitesse arbitraire de 5)
|
|
|
|
|
double vitesseDefilement = 5.0;
|
|
|
|
|
|
|
|
|
|
// On met à jour le x de la ligne (utilisé pour le calcul de position)
|
|
|
|
|
this.x -= vitesseDefilement;
|
|
|
|
|
|
|
|
|
|
// On répercute sur chaque segment
|
|
|
|
|
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
|
|
|
}
|