Vamos simular um floco de neve aleatório

10

Vi essa pergunta em https://mathematica.stackexchange.com/ e acho muito legal. Vamos fazer o floco de neve com outras linguagens de programação.

Esta é uma citação da pergunta original:

É a estação ... E já é hora de fazer minha primeira pergunta no Mathematica Stack Exchange. Então, aqui está uma busca de férias para vocês, gurus gráficos (e P-Chem?).

Qual é o seu melhor código para gerar um floco de neve (aleatório)? Por acaso, quero dizer com formas diferentes que imitarão a diversidade exibida por flocos de neve reais. Aqui está um link para ter uma idéia: http://www.its.caltech.edu/~atomic/snowcrystals/ , mais especificamente, aqui estão os diferentes tipos de flocos de neve: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm . Aqui estamos tentando gerar um único floco de neve (possivelmente com parâmetros diferentes para ajustar sua forma), quanto mais realista, melhor. Renderizações tridimensionais, para adicionar translucidez e cores, também são bem-vindas. Liberte sua fantasia, vá além dos fractais de sempre!

Regras:

  • Gere um único floco de neve aleatório.
  • O floco deve ter simetria radial seis vezes maior.
  • Não precisa ser realista. (Mas prefiro)
  • Respostas de caracteres únicos, como *, ⚹, ❅, ❄, ❆ não são permitidas.
  • Mais vitórias positivas!
pt2121
fonte
3
É melhor não permitir saídas de caracteres únicos como '*⚹❅❄❆'[Math.floor(Math.random()*5)].
manatwork
11
@ nitro2k01: você percebe que ele fez referência àquele site mathematica.SE exato na primeira frase da postagem, certo?
Kyle Kanos
OPA, desculpe. Sinceramente, pulei direto para as regras.
Nitro2k01

Respostas:

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:

Exemplo de execução:

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

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

montagem do floco de neve

homem a trabalhar
fonte
5

Javascript

Fiddle localizado aqui

Fiddle mais chique localizado aqui

Não é um jogo de golfe, nem de longe. Também são necessárias a função Perlin Noise e o Random semeado (ambos incluídos no Fiddle, semeados aleatórios necessários para o Perlin). O Fiddle também exibe a semente atual para acompanhar os favoritos;)

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
fonte
0

ZXSpectrum Basic, 21

Bem, eu não posso fazer a simetria de 6 vezes, mas posso obter todo tipo de aleatoriedade

usando o ZX Spectrum: Emulator Here

Lembre-se de que as palavras-chave são um único caractere no ZX Spectrum

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

Para inserir esses comandos no emulador:

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

(Você não ama apenas o teclado espectral)

SeanC
fonte
Isso não funciona. Ele gera "B Inteiro fora do intervalo, 0: 1" ou renderiza uma forma estranha de rosca.
Lars Ebert
o lado ruim do código do espectro é que os gráficos às vezes excedem a quantidade mínima de espaço na tela. alterar a 3ª série no sorteio para obter diferentes padrões e formas
SeanC