figure_de_lichtenberg
Ceci est une ancienne révision du document !
Table des matières
Figures de Lichtenberg
https://en.wikipedia.org/wiki/Lichtenberg_figure En mode analogique : https://youtu.be/1jhqZg8UBJU?t=145
Sinon d’autres renseignements : http://capturedlightning.com/frames/lichtenbergs.html
Illustration
Théorie
Simulation
Processing
ArrayList<Marcheur> arbre; ArrayList<Marcheur> marcheurs; int nombreMarcheurs = 2000; int rangMax = 0; void setup() { size(1600, 1000); arbre = new ArrayList<Marcheur>(); arbre.add(new Marcheur(width / 2, height)); marcheurs = new ArrayList<Marcheur>(); for (int i = 0; i < nombreMarcheurs; i++) { marcheurs.add(new Marcheur()); } } void draw() { background(0); for (int i = marcheurs.size() - 1; i >= 0; i--) { Marcheur m = marcheurs.get(i); m.rafraichir(); //m.afficher(rangMax); for (int j = 0; j < arbre.size(); j++) { Marcheur ma = arbre.get(j); if (m.position.dist(ma.position) < (2 * ma.rayon - 4)) { if (m.position.y < ma.position.y) { marcheurs.remove(m); m.rayon = ma.rayon * 0.97; m.rang = ma.rang + 1; m.parent = ma; if (m.rang > rangMax) { rangMax = m.rang; } arbre.add(m); break; } else { m.position = haut(); } } } } for (int i = arbre.size() - 1; i >= 0; i--) { Marcheur ma = arbre.get(i); ma.afficher(rangMax); } if (marcheurs.size() == 0) { affichageArbre(); println(rangMax); saveFrame("images/DLA-######.png"); noLoop(); } } void affichageArbre() { background(0); for (int j = 1; j < arbre.size(); j++) { Marcheur ma1 = arbre.get(j); Marcheur ma2 = ma1.parent; stroke(255); strokeWeight(ma2.rayon / 3.5); line(ma1.position.x, ma1.position.y, ma2.position.x, ma2.position.y); } } class Marcheur { PVector position; Marcheur parent; float rayon; int rang; Marcheur() { position = haut(); rayon = 15; rang = 0; } Marcheur(int x, int y) { position = new PVector(x, y); rayon = 30; rang = 0; } void rafraichir() { PVector vitesse = PVector.random2D().setMag(30); position.add(vitesse); position.x = constrain(position.x, 0, width); position.y = constrain(position.y, 0, height); } void afficher(int r) { noStroke(); int teinte = (int)map(rang, 0, r, 255, 10); fill(teinte); ellipse(position.x, position.y, 2 * rayon, 2 * rayon); } } PVector pourtour() { int a = (int)random(3); if (a == 0) { float r = random(width); return new PVector(r, 0); } else if (a == 1) { float t = random(height); return new PVector(0, t); } else { float u = random(width); return new PVector(width, u); } } PVector haut() { float r = random(width); return new PVector(r, 0); } float distSq(PVector a, PVector b) { float dx = b.x - a.x; float dy = b.y - a.y; return dx * dx + dy * dy; }
Code
Heightmap
Agrégation limitée par la diffusion (DLA)
figure_de_lichtenberg.1573991483.txt.gz · Dernière modification : 2019/11/17 11:51 de Mushussu