From 5a884429fa5b4f58a2449b9f35f55420807f18e2 Mon Sep 17 00:00:00 2001 From: MOISOIU Stefan-Mihai <66520304+stefanmoisoiu@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:29:41 +0100 Subject: [PATCH] bruit de perlin --- src/Jeu.java | 4 +- src/Ligne.java | 7 +- src/NoiseGenerator.java | 161 ++++++++++++++++++++++++++++++++++++++++ src/Segment.java | 6 +- 4 files changed, 170 insertions(+), 8 deletions(-) create mode 100644 src/NoiseGenerator.java diff --git a/src/Jeu.java b/src/Jeu.java index 4e653eb..91af6e8 100644 --- a/src/Jeu.java +++ b/src/Jeu.java @@ -38,7 +38,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener { protected Cercle demiCercleArriere = new Cercle(90, 180); // celui qui est derrière la ligne // A FAIRE : ajouter les objets graphiques manquants, s'il y en a - protected Ligne lili = new Ligne(); + protected Ligne lili = new Ligne(new NoiseGenerator(0)); // Timer : un objet qui émet des événements à un intervalle choisi, // il sert à donner le pas de l'animation @@ -354,7 +354,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener { } // on recrée une nouvelle ligne propre pour la prochaine partie - lili = new Ligne(); + lili = new Ligne(new NoiseGenerator(0)); demiCercleAvant.y = 200; demiCercleAvant.vitesse = -1.0; diff --git a/src/Ligne.java b/src/Ligne.java index 93fe37a..4f85f2d 100644 --- a/src/Ligne.java +++ b/src/Ligne.java @@ -17,15 +17,16 @@ public class Ligne extends ObjetGraphique { protected double limiteHaut = 50; protected double limiteBas = 550; - public Ligne() { + public Ligne(NoiseGenerator noiseGenerator) { double x = 0; double y = 200; double dx, dy; Segment s; for (int i = 0; i < nbSegments; i++) { - dx = Math.random() * 20 + 80; - dy = Math.random() * 40 - 20; + dx = 10; + + dy = noiseGenerator.noise(x / 15) * 8; if (y + dy > limiteBas) { dy = limiteBas - y; diff --git a/src/NoiseGenerator.java b/src/NoiseGenerator.java new file mode 100644 index 0000000..650f43c --- /dev/null +++ b/src/NoiseGenerator.java @@ -0,0 +1,161 @@ +package linea; + +import java.util.Random; + +public class NoiseGenerator { + private double seed; + private long default_size; + private int[] p; + private int[] permutation; + + public NoiseGenerator(double seed) { + this.seed = seed; + init(); + } + + public NoiseGenerator() { + this.seed = new Random().nextGaussian() * 255; + init(); + } + + private void init() { + // Initialize the permutation array. + this.p = new int[512]; + this.permutation = new int[] { 151, 160, 137, 91, 90, 15, 131, 13, 201, + 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, + 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, + 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, + 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, + 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, + 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, + 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, + 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, + 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, + 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, + 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, + 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, + 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, + 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, + 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, + 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, + 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, + 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, + 215, 61, 156, 180 }; + this.default_size = 35; + + // Populate it + for (int i = 0; i < 256; i++) { + p[256 + i] = p[i] = permutation[i]; + } + + } + + public void setSeed(double seed) { + this.seed = seed; + } + + public double getSeed() { + return this.seed; + } + + public double noise(double x, double y, double z, int size) { + double value = 0.0; + double initialSize = size; + + while (size >= 1) { + value += smoothNoise((x / size), (y / size), (z / size)) * size; + size /= 2.0; + } + + return value / initialSize; + } + + public double noise(double x, double y, double z) { + double value = 0.0; + double size = default_size; + double initialSize = size; + + while (size >= 1) { + value += smoothNoise((x / size), (y / size), (z / size)) * size; + size /= 2.0; + } + + return value / initialSize; + } + + public double noise(double x, double y) { + double value = 0.0; + double size = default_size; + double initialSize = size; + + while (size >= 1) { + value += smoothNoise((x / size), (y / size), (0f / size)) * size; + size /= 2.0; + } + + return value / initialSize; + } + + public double noise(double x) { + double value = 0.0; + double size = default_size; + double initialSize = size; + + while (size >= 1) { + value += smoothNoise((x / size), (0f / size), (0f / size)) * size; + size /= 2.0; + } + + return value / initialSize; + } + + public double smoothNoise(double x, double y, double z) { + // Offset each coordinate by the seed value + x += this.seed; + y += this.seed; + x += this.seed; + + int X = (int) Math.floor(x) & 255; // FIND UNIT CUBE THAT + int Y = (int) Math.floor(y) & 255; // CONTAINS POINT. + int Z = (int) Math.floor(z) & 255; + + x -= Math.floor(x); // FIND RELATIVE X,Y,Z + y -= Math.floor(y); // OF POINT IN CUBE. + z -= Math.floor(z); + + double u = fade(x); // COMPUTE FADE CURVES + double v = fade(y); // FOR EACH OF X,Y,Z. + double w = fade(z); + + int A = p[X] + Y; + int AA = p[A] + Z; + int AB = p[A + 1] + Z; // HASH COORDINATES OF + int B = p[X + 1] + Y; + int BA = p[B] + Z; + int BB = p[B + 1] + Z; // THE 8 CUBE CORNERS, + + return lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z ), // AND ADD + grad(p[BA], x - 1, y, z )), // BLENDED + lerp(u, grad(p[AB], x, y - 1, z ), // RESULTS + grad(p[BB], x - 1, y - 1, z ))),// FROM 8 + lerp(v, lerp(u, grad(p[AA + 1], x, y, z - 1 ), // CORNERS + grad(p[BA + 1], x - 1, y, z - 1 )), // OF CUBE + lerp(u, grad(p[AB + 1], x, y - 1, z - 1 ), + grad(p[BB + 1], x - 1, y - 1, z - 1 )))); + } + + private double fade(double t) { + return t * t * t * (t * (t * 6 - 15) + 10); + } + + private double lerp(double t, double a, double b) { + return a + t * (b - a); + } + + private double grad(int hash, double x, double y, double z) { + int h = hash & 15; // CONVERT LO 4 BITS OF HASH CODE + double u = h < 8 ? x : y, // INTO 12 GRADIENT DIRECTIONS. + v = h < 4 ? y : h == 12 || h == 14 ? x : z; + return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); + } +} \ No newline at end of file diff --git a/src/Segment.java b/src/Segment.java index 570c0f6..1e0e8ec 100644 --- a/src/Segment.java +++ b/src/Segment.java @@ -24,8 +24,8 @@ public class Segment extends ObjetGraphique { // Hérite de la classe ObjetGraph public Segment(){ x = 0; y = 0; - xLong = 50; - yLong = 50; + xLong = 10; + yLong = 10; } public Segment(double xx, double yy, double xxLong, double yyLong){ @@ -44,7 +44,7 @@ public class Segment extends ObjetGraphique { // Hérite de la classe ObjetGraph g.setColor(this.couleur); // on dessine le segment (on pourrait faire mieux...) - g.drawLine((int)Math.round(x), (int)Math.round(y), (int)Math.round(x + xLong), (int)Math.round(y+yLong)); + g.drawLine((int)Math.round(x), (int)Math.round(y), (int)Math.round(x + xLong), (int)Math.round(y+yLong)); } //-------------------------------------------------------------------------