2026-02-02 11:40:03 +01:00
|
|
|
package linea;
|
2026-02-02 11:19:18 +01:00
|
|
|
|
|
|
|
|
import java.awt.BasicStroke;
|
|
|
|
|
import java.awt.Color;
|
|
|
|
|
import java.awt.Graphics;
|
|
|
|
|
import java.awt.Graphics2D;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
2026-02-10 15:48:46 +01:00
|
|
|
public class Ligne extends ObjetGraphique {
|
2026-02-02 11:19:18 +01:00
|
|
|
|
2026-03-16 16:17:30 +01:00
|
|
|
protected int nbSegments = 50;
|
2026-02-02 11:19:18 +01:00
|
|
|
protected Segment SegCourant;
|
2026-02-10 15:48:46 +01:00
|
|
|
|
|
|
|
|
protected ArrayList<Segment> listeSegments = new ArrayList<Segment>();
|
|
|
|
|
|
2026-03-04 15:00:29 +01:00
|
|
|
protected Segment dernierSegment;
|
|
|
|
|
private double decalageXDernierSegment = 0;
|
|
|
|
|
|
|
|
|
|
private NoiseGenerator noiseGenerator;
|
2026-03-16 16:09:19 +01:00
|
|
|
private GestionnaireNiveau gestionnaireNiveau;
|
2026-03-04 15:00:29 +01:00
|
|
|
|
|
|
|
|
private double xActuel;
|
|
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
// Curseur dans le noise : avance plus vite quand la frequence du niveau augmente
|
|
|
|
|
private double noiseCurseur = 0;
|
|
|
|
|
|
|
|
|
|
public Ligne(NoiseGenerator noiseGenerator, GestionnaireNiveau gestionnaireNiveau) {
|
2026-02-10 16:24:44 +01:00
|
|
|
double x = 0;
|
2026-02-10 15:48:46 +01:00
|
|
|
|
2026-03-04 15:00:29 +01:00
|
|
|
this.noiseGenerator = noiseGenerator;
|
2026-03-16 16:09:19 +01:00
|
|
|
this.gestionnaireNiveau = gestionnaireNiveau;
|
|
|
|
|
|
|
|
|
|
double dx = GetLargeurSegment();
|
|
|
|
|
|
2026-02-23 08:57:26 +01:00
|
|
|
for (int i = 0; i < nbSegments; i++) {
|
2026-03-17 14:31:00 +01:00
|
|
|
double noiseStep = getNoiseStep();
|
2026-03-16 16:09:19 +01:00
|
|
|
double yDebut = CalculerY(noiseCurseur);
|
|
|
|
|
double yFin = CalculerY(noiseCurseur + noiseStep);
|
2026-02-23 11:29:41 +01:00
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
Segment s = new Segment(x, yDebut, dx, yFin - yDebut);
|
|
|
|
|
s.setCouleur(new Color(0.2f, 0.2f, 0.2f));
|
2026-02-23 08:57:26 +01:00
|
|
|
|
2026-03-04 15:00:29 +01:00
|
|
|
listeSegments.add(s);
|
2026-03-16 16:09:19 +01:00
|
|
|
noiseCurseur += noiseStep;
|
2026-03-04 15:00:29 +01:00
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
if (i == nbSegments - 1) {
|
2026-03-04 15:00:29 +01:00
|
|
|
dernierSegment = s;
|
2026-03-16 16:09:19 +01:00
|
|
|
xActuel = x + dx;
|
2026-02-23 08:57:26 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
x += dx;
|
2026-03-04 15:00:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
2026-02-10 15:48:46 +01:00
|
|
|
|
2026-03-04 15:00:29 +01:00
|
|
|
protected double GetLargeurSegment(){
|
|
|
|
|
return (double)ZoneDessin.largeur / nbSegments;
|
|
|
|
|
}
|
2026-02-10 15:48:46 +01:00
|
|
|
|
2026-03-17 14:31:00 +01:00
|
|
|
private double getNoiseStep() {
|
|
|
|
|
return GetLargeurSegment() / gestionnaireNiveau.getNoiseFrequence();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
protected Segment CreerSegmentSuivant(){
|
2026-03-17 14:31:00 +01:00
|
|
|
double noiseStep = getNoiseStep();
|
2026-03-16 16:09:19 +01:00
|
|
|
|
|
|
|
|
double yDebut = CalculerY(noiseCurseur);
|
|
|
|
|
double yFin = CalculerY(noiseCurseur + noiseStep);
|
2026-03-04 15:00:29 +01:00
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
noiseCurseur += noiseStep;
|
2026-03-04 15:00:29 +01:00
|
|
|
|
2026-03-17 14:31:00 +01:00
|
|
|
Segment s = new Segment(0, yDebut, GetLargeurSegment(), yFin - yDebut);
|
2026-03-04 15:00:29 +01:00
|
|
|
s.setCouleur(new Color(0.2f, 0.2f, 0.2f));
|
|
|
|
|
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
protected double CalculerY(double noisePos){
|
|
|
|
|
double limiteHaut = gestionnaireNiveau.getLimiteHaut();
|
|
|
|
|
double limiteBas = gestionnaireNiveau.getLimiteBas();
|
2026-03-04 15:00:29 +01:00
|
|
|
double hauteur = limiteBas - limiteHaut;
|
|
|
|
|
|
2026-03-16 16:47:27 +01:00
|
|
|
double bruit = noiseGenerator.noise(noisePos, 1);
|
2026-03-16 16:09:19 +01:00
|
|
|
double normalise = (bruit + 1) / 2;
|
2026-03-04 15:00:29 +01:00
|
|
|
|
2026-03-16 16:09:19 +01:00
|
|
|
return limiteBas - normalise * hauteur;
|
2026-02-02 11:19:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2026-02-23 08:57:26 +01:00
|
|
|
public void Afficher(Graphics g) {
|
2026-02-02 11:19:18 +01:00
|
|
|
Graphics2D g2D = (Graphics2D) g;
|
|
|
|
|
g2D.setStroke(new BasicStroke(3.0f));
|
2026-02-10 15:48:46 +01:00
|
|
|
|
2026-02-23 08:57:26 +01:00
|
|
|
for (Segment s : listeSegments) {
|
2026-02-10 15:48:46 +01:00
|
|
|
s.Afficher(g);
|
2026-02-23 08:57:26 +01:00
|
|
|
if (SegCourant == null) {
|
2026-03-04 15:00:29 +01:00
|
|
|
if (Cercle.xCercle <= s.x + s.xLong && Cercle.xCercle >= s.x) {
|
2026-02-23 08:57:26 +01:00
|
|
|
SegCourant = s;
|
2026-02-10 16:24:44 +01:00
|
|
|
}
|
2026-02-23 08:57:26 +01:00
|
|
|
} else {
|
2026-03-04 15:00:29 +01:00
|
|
|
if ((SegCourant.x + SegCourant.xLong) < Cercle.xCercle) {
|
|
|
|
|
if (s.x <= Cercle.xCercle && (s.x + s.xLong) >= Cercle.xCercle) {
|
2026-02-23 08:57:26 +01:00
|
|
|
SegCourant = s;
|
2026-02-10 16:24:44 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-10 15:48:46 +01:00
|
|
|
}
|
2026-02-02 11:19:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void Animer() {
|
2026-03-16 16:09:19 +01:00
|
|
|
double vitesse = gestionnaireNiveau.getVitesseScroll();
|
|
|
|
|
|
2026-02-23 08:57:26 +01:00
|
|
|
for (Segment s : listeSegments) {
|
2026-02-10 15:48:46 +01:00
|
|
|
s.Animer();
|
2026-03-16 16:09:19 +01:00
|
|
|
s.x -= vitesse;
|
2026-02-10 15:48:46 +01:00
|
|
|
}
|
2026-03-04 15:00:29 +01:00
|
|
|
|
|
|
|
|
UpdateSegments();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateSegments(){
|
|
|
|
|
|
|
|
|
|
if (dernierSegment == null) throw new RuntimeException("dernierSegment n'existe pas");
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < listeSegments.size(); i++) {
|
|
|
|
|
|
|
|
|
|
Segment s = listeSegments.get(i);
|
|
|
|
|
if (s.x + s.xLong < 0) {
|
2026-03-16 16:09:19 +01:00
|
|
|
Segment nouveauSegment = CreerSegmentSuivant();
|
2026-03-04 15:00:29 +01:00
|
|
|
nouveauSegment.x = dernierSegment.x + dernierSegment.xLong;
|
|
|
|
|
listeSegments.set(i, nouveauSegment);
|
|
|
|
|
|
|
|
|
|
xActuel += GetLargeurSegment();
|
|
|
|
|
dernierSegment = nouveauSegment;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-02 11:19:18 +01:00
|
|
|
}
|
2026-02-23 10:07:29 +01:00
|
|
|
|
|
|
|
|
public double GetHauteurPointCercle(){
|
|
|
|
|
double t = (400 - SegCourant.x) / SegCourant.xLong;
|
|
|
|
|
|
|
|
|
|
return SegCourant.y + SegCourant.yLong * t;
|
|
|
|
|
}
|
2026-03-16 16:09:19 +01:00
|
|
|
}
|