Simulieren wir eine zufällige Schneeflocke


10

Ich habe diese Frage auf /mathematica// gesehen und finde sie ziemlich cool. Lassen Sie uns die Schneeflocke mit anderen Programmiersprachen machen.

Dies ist ein Zitat aus der ursprünglichen Frage:

Es ist die Saison ... Und es ist an der Zeit, meine erste Frage zu Mathematica Stack Exchange zu stellen. Also, hier ist eine Urlaubssuche für Sie Grafik- (und P-Chem?) Gurus.

Was ist Ihr bester Code zum Erzeugen einer (zufälligen) Schneeflocke? Mit Zufall meine ich mit verschiedenen Formen, die die Vielfalt der echten Schneeflocken nachahmen. Hier ist ein Link, um eine Idee zu haben: http://www.its.caltech.edu/~atomic/snowcrystals/ , genauer gesagt, hier sind die verschiedenen Arten von Schneeflocken: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm . Hier versuchen wir, eine einzelne Schneeflocke zu erzeugen (möglicherweise mit unterschiedlichen Parametern, um ihre Form abzustimmen). Je realistischer, desto besser. Dreidimensionale Renderings zum Hinzufügen von Transluzenz und Farben sind ebenfalls willkommen. Entfessle deine Fantasie, gehe über die üblichen Fraktale hinaus!

Regeln:

  • Erzeugen Sie eine zufällige einzelne Schneeflocke.
  • Die Flocke sollte eine sechsfache radiale Symmetrie aufweisen.
  • Es muss nicht realistisch sein. (Aber lieber)
  • Einzelzeichenantworten wie *, ⚹, ❅, ❄, ❆ sind nicht zulässig.
  • Die meisten Upvotes gewinnen!

3
Besser Einzelzeichenausgänge wie '*⚹❅❄❆'[Math.floor(Math.random()*5)].
Manatwork

1
@ nitro2k01: Sie erkennen, dass er genau diese mathematica.SE-Site im allerersten Satz des Beitrags referenziert hat , richtig?
Kyle Kanos

Ups, tut mir Leid. Ich habe mich ehrlich an die Regeln gehalten.
Nitro2k01

Antworten:


14

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

Probelauf:

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

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

Schneeflockenmontage


5

Javascript

Geige befindet sich hier

Mehr schicke Geige befindet sich hier

Es ist noch lange nicht Golf gespielt. Ebenfalls erforderlich sind die Perlin Noise-Funktion und Seed Random (beide in Fiddle enthalten, Seed Random für Perlin erforderlich). Fiddle zeigt auch den aktuellen Startwert an, um die Favoriten zu verfolgen;)

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

Nun, ich kann die 6-fache Symmetrie nicht machen, aber ich kann alle Arten von Zufälligkeit bekommen

mit dem ZX Spectrum: Emulator hier

Denken Sie daran, dass Schlüsselwörter im ZX-Spektrum ein einzelnes Zeichen sind

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

So geben Sie diese Befehle in den Emulator ein:

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

(Lieben Sie nicht nur die Spektrumstastatur)


Das funktioniert nicht. Es gibt entweder "B Integer außerhalb des Bereichs, 0: 1" aus oder rendert eine seltsame Donutform.
Lars Ebert

Das Schlechte am Spektrum-Code ist, dass Diagramme manchmal den minimalen Bildschirmbereich überschreiten. Ändern Sie die 3. Zahl in der Auslosung, um verschiedene Muster und Formen zu erhalten
SeanC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.