Simuliamo un fiocco di neve casuale


10

Ho visto questa domanda su https://mathematica.stackexchange.com/ e penso che sia piuttosto interessante. Facciamo il fiocco di neve con altri linguaggi di programmazione.

Questa è una citazione dalla domanda originale:

È la stagione ... Ed è giunto il momento di porre la mia prima domanda su Mathematica Stack Exchange. Quindi, ecco una ricerca per le vacanze per voi guru della grafica (e di P-Chem?).

Qual è il tuo miglior codice per generare un fiocco di neve (casuale)? Per casuale intendo con forme diverse che imiteranno la diversità esibita da veri fiocchi di neve. Ecco un link per avere un'idea: http://www.its.caltech.edu/~atomic/snowcrystals/ , più specificamente qui ci sono i diversi tipi di fiocchi di neve: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm . Qui stiamo provando a generare un singolo fiocco di neve (possibilmente con parametri diversi per regolarne la forma), più realistico, meglio è. Sono graditi anche rendering tridimensionali, per aggiungere traslucenza e colori. Scatena la tua fantasia, vai oltre i soliti frattali!

Regole:

  • Genera un singolo fiocco di neve casuale.
  • Il fiocco dovrebbe essere una simmetria radiale sei volte.
  • Non deve essere realistico. (Ma preferisco)
  • Le risposte a carattere singolo, come *, ⚹, ❅, ❄, ❆ non sono consentite.
  • La maggior parte dei voti vince!

3
Meglio vietare output di singoli caratteri come '*⚹❅❄❆'[Math.floor(Math.random()*5)].
arte

1
@ nitro2k01: ci si rende conto che egli fa riferimento che precisa sito mathematica.SE nella primissima frase del distacco, giusto?
Kyle Kanos,

Oops scusa. Onestamente ho saltato il diritto alle regole.
nitro2k01,

Risposte:


14

Bash e 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:

Esecuzione di esempio:

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

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

montaggio fiocco di neve


5

Javascript

Violino situato qui

Fiddle più elegante situato qui

Non è golf, non da un colpo lungo. Sono anche necessarie la funzione Rumore perlin e Casuale seeded (entrambi inclusi in Fiddle, seeded random necessario per Perlin). Fiddle mostra anche il seme corrente per tenere traccia dei preferiti;)

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);
    }
}

0

ZXSpectrum Basic, 21

Bene, non riesco a fare la simmetria 6 volte, ma posso ottenere ogni sorta di casualità

usando lo spettro ZX: emulatore qui

Ricorda che le parole chiave sono un singolo carattere nello ZX Spectrum

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

Per inserire questi comandi sull'emulatore:

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

(Non ti piace solo la tastiera dello spettro)


Questo non funziona. Emette "B Integer out of range, 0: 1" o rende una strana forma a ciambella.
Lars Ebert,

la cosa negativa del codice dello spettro è che i grafici a volte superano la minima quantità di spazio sullo schermo. modifica il 3 ° numero nel sorteggio per ottenere diversi modelli e forme
SeanC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.