Simulons un flocon de neige aléatoire

10

J'ai vu cette question sur https://mathematica.stackexchange.com/ et je pense que c'est plutôt cool. Faisons le flocon de neige avec d'autres langages de programmation.

Ceci est une citation de la question d'origine:

C'est la saison ... Et il est temps que je pose ma première question sur Mathematica Stack Exchange. Alors, voici une quête de vacances pour vous, gourous du graphisme (et de P-Chem?).

Quel est votre meilleur code pour générer un flocon de neige (aléatoire)? Par hasard, je veux dire avec différentes formes qui imiteront la diversité présentée par de vrais flocons de neige. Voici un lien pour avoir une idée: http://www.its.caltech.edu/~atomic/snowcrystals/ , plus précisément voici les différents types de flocons de neige: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm . Ici, nous essayons de générer un seul flocon de neige (éventuellement avec différents paramètres pour régler sa forme), le plus réaliste, mieux c'est. Les rendus tridimensionnels, pour ajouter de la translucidité et des couleurs sont également les bienvenus. Libérez votre fantaisie, allez au-delà des fractales habituelles!

Règles:

  • Générez un flocon de neige unique aléatoire.
  • Le flocon doit avoir une symétrie radiale six fois.
  • Cela n'a pas besoin d'être réaliste. (Mais préférez)
  • Les réponses à un seul caractère, comme *, ⚹, ❅, ❄, ❆ ne sont pas autorisées.
  • La plupart des votes positifs gagnent!
pt2121
la source
3
Mieux vaut interdire les sorties à caractère unique comme '*⚹❅❄❆'[Math.floor(Math.random()*5)].
manatwork
1
@ nitro2k01: vous vous rendez compte qu'il a fait référence à ce site mathica.SE exact dans la toute première phrase de l'affichage, non?
Kyle Kanos
Oops désolé. Honnêtement, je suis passé directement aux règles.
nitro2k01

Réponses:

14

Bash et ImageMagick

#!/bin/bash

third=()
x=90
y=90
while (( x>10 )); do
  (( dx=RANDOM%10 ))
  while :; do (( dy=RANDOM%21-10 )); (( y-dy<95 )) && (( y-dy>(x-dx)/2 )) && break; done
  third+=(
    -draw "line $x,$y $(( x-dx )),$(( y-dy ))"
    -draw "line $x,$(( 200-y )) $(( x-dx )),$(( 200-y+dy ))"
    -draw "line $(( 200-x )),$y $(( 200-x+dx )),$(( y-dy ))"
    -draw "line $(( 200-x )),$(( 200-y )) $(( 200-x+dx )),$(( 200-y+dy ))"
  )
  (( x-=dx ))
  (( y-=dy ))
done

third+=(
  -draw "line 90,90 90,110"
  -draw "line $x,$y 15,100"
  -draw "line $x,$(( 200-y )) 15,100"
  -draw "line 110,90 110,110"
  -draw "line $(( 200-x )),$y 185,100"
  -draw "line $(( 200-x )),$(( 200-y )) 185,100"
  -draw 'color 20,100 filltoborder'
  -draw 'color 180,100 filltoborder'
)

convert \
  -size '200x200' \
  xc:skyblue \
  -background skyblue \
  -stroke 'white' \
  -strokewidth 1 \
  -fill 'white' \
  -bordercolor 'white' \
  -fuzz 10% \
  "${third[@]}" \
  -rotate 120 \
  -crop '200x200' \
  "${third[@]}" \
  -rotate 120 \
  -crop '200x200' \
  "${third[@]}" \
  -draw 'ellipse 100,100 15,15 0,360' \
  x:

Exemple d'exécution:

bash-4.1$ for i in {1..30}; do ./showflake.sh "showflake-$i.png"; done

bash-4.1$ montage showflake-*.png x:

montage de flocon de neige

homme au travail
la source
5

Javascript

Violon situé ici

Plus de violon fantaisie situé ici

Ce n'est pas joué au golf, pas de loin. La fonction Perlin Noise et le seeded Random (tous deux inclus dans Fiddle, le seeded random nécessaire pour Perlin) sont également requis. Fiddle affiche également la graine actuelle pour garder une trace des favoris;)

function DoFlake(canvas){
    var width = canvas.width;
    var height = canvas.height;

    var ctx = canvas.getContext('2d');
    var thing = document.createElement('canvas'); thing.width = 128; thing.height = 32;
    var thingctx = thing.getContext('2d');
    var noise = new ImprovedPerlin((new Date()).getTime());

    var wDiv = 1/64;
    var y = 7/32;
    var z = 2/11;

    for(var x = 0; x < 128; x++){
        var h = 32 - (x * 32 / 128);
        h += 16 * noise.Noise(4 * x * wDiv, y, z);
        h += 8 * noise.Noise(8 * x * wDiv, y, z);
        h += 4 * noise.Noise(16 * x * wDiv, y, z);
        h += 2 * noise.Noise(32 * x * wDiv, y, z);
        h += 1 * noise.Noise(64 * x * wDiv, y, z);

        thingctx.fillRect(x, 0, 1, h);
    }

    ctx.translate(128,128);
    var angle = Math.PI / 3;
    for(var i = 0; i < 6; i++){
        ctx.rotate(angle);
        ctx.drawImage(thing, 0, 0);
        ctx.scale(1, -1)
        ctx.drawImage(thing, 0, 0);
        ctx.scale(1, -1);
    }
}
XNargaHuntress
la source
0

ZXSpectrum Basic, 21

Eh bien, je ne peux pas faire la symétrie 6 fois, mais je peux obtenir toutes sortes d'aléatoires

en utilisant le ZX Spectrum: Emulator Here

N'oubliez pas que les mots clés sont un seul caractère dans le spectre ZX

OVER 1
PLOT 40,40
DRAW 40,40,RND*5000

Pour entrer ces commandes sur l'émulateur:

TAB ,1 ENTER
q 40,40 ENTER
w 40,40, TAB tCTRL+ B5000ENTER

(N'aimez-vous pas simplement le clavier du spectre)

SeanC
la source
Cela ne fonctionne pas. Il génère soit "B Entier hors de portée, 0: 1", soit rend une étrange forme de beignet.
Lars Ebert
la mauvaise chose à propos du code du spectre est que les tracés dépassent parfois la quantité minimale d'espace à l'écran. modifier le 3e numéro du tirage pour obtenir différents motifs et formes
SeanC