O Chaos Game é um método simples para gerar fractais. Dado um ponto de partida, uma proporção de comprimento r e um conjunto de pontos 2D, faça o seguinte:
- No seu conjunto de pontos, escolha um aleatoriamente (uniformemente).
- Calcule a média desse ponto e o último ponto desenhado (ou o ponto inicial) usando r e 1 - r como pesos (ou seja, r = 0 significa que você obtém o ponto de partida, r = 1 significa que você obtém o ponto aleatório er = 0,5 significa que você entre no meio do caminho.)
- Desenhe o ponto resultante.
Por exemplo, se você escolher os vértices de um triângulo equilátero er = 0,5 , os pontos plotados mapearão um triângulo de Sierpinski:
Imagem encontrada na Wikipedia
Você deve escrever um programa ou função que "reproduza" o jogo do caos para criar um fractal.
Entrada
Você pode escrever um programa ou uma função e receber as seguintes entradas via ARGV, STDIN ou argumento da função:
- O número de pontos a serem plotados.
- A coordenada inicial (que também deve ser plotada!).
- O peso médio r no intervalo [0,1] .
- Uma lista de pontos para escolher.
Saída
Você pode renderizar na tela ou gravar um arquivo de imagem. Se o resultado for rasterizado, ele precisará ter pelo menos 600 pixels de cada lado, todos os pontos deverão estar na tela e pelo menos 75% da extensão horizontal e vertical da imagem deverão ser usados para pontos (isso é para evitar respostas com um único pixel preto dizendo "está muito longe"). O x e y eixo deve estar na mesma escala (que é a linha de (0,0) para (1,1) deve estar a um ângulo de 45 graus) e cada ponto representado no jogo caos deve ser representada como uma única pixel (se o seu método de plotagem suavizar o ponto, ele pode ser espalhado por 2x2 pixels).
As cores são a sua escolha, mas você precisa de pelo menos duas cores distinguíveis: uma para o fundo e outra para os pontos plotados durante o jogo do caos. Você pode, mas não precisa plotar os pontos de entrada.
Inclua três exemplos de resultados interessantes em sua resposta.
Pontuação
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Editar: você não precisa mais plotar os pontos de entrada, pois eles não são realmente visíveis como pixels únicos de qualquer maneira.
fonte
Respostas:
Mathematica, 89
Como funciona
No Mathematica, a
Graphics[]
função produz gráficos escaláveis, você o renderiza para o tamanho que desejar, simplesmente arrastando os cantos da imagem. De fato, o tamanho inicial de todos os gráficos exibidos é uma configuração ".ini" que você pode definir em 600 ou em qualquer outro valor que desejar. Portanto, não há necessidade de fazer nada de especial para o requisito de 600x600.A
AbsolutePointSize[]
coisa especifica que o tamanho do ponto não será modificado aumentando o tamanho da imagem.A construção principal é
ou no pseudo-código não-golfe:
Ele está construindo recursivamente uma lista iniciando
(start point)
e aplicando a função (vetorial) no primeiro argumento a cada ponto sucessivo, retornando finalmente a lista de todos os pontos calculados a serem plotados porPoint[]
Alguns exemplos de auto-replicação:
fonte
Instructions for testing this answer without Mathematica installed:
1) Faça o download do pastebin e salve-o como * .CDF 2) Faça o download e instale o ambiente CDF gratuito da Wolfram Research em (não é um arquivo pequeno). Apreciar. Diga-me se funciona!#r
der#
fugir sem um espaço ou*
no meio.#
er
.#key
. Tenho certeza que isso será útil. :)Java: 246
253447Como uma função
m()
:Quebras de linha (dentro de um programa para mostrar o uso):
Os pontos de entrada de desenho foram removidos dos requisitos (yay 80 bytes!). Eles ainda são mostrados nas capturas de tela antigas abaixo, mas não aparecerão se você executá-la. Veja o histórico de revisões, se estiver interessado.
As entradas são fornecidas como uma matriz de flutuadores. A primeira é iterações, as próximas duas estão começando
x y
. O quarto ér
, e por último, a lista de coordenadas, nax1 y1 x2 y2 ...
moda.Estrela ninja
Cruz
Octochains
fonte
show
é obsoletoshow()
está obsoleto, mas ainda funciona. Quando você diz "não funciona", o que isso significa? Se você não possui o Java 8, será necessário adicionar umfinal
aoString[]a
principal.JavaScript (E6) + Html
173176193Edit: corte grande, graças a William Barbosa
Editar: 3 bytes a menos, graças ao DocMax
173 bytes contando a função e o elemento canvas necessário para mostrar a saída.
Teste salvar como arquivo html e abra no FireFox.
JSFiddle
fonte
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>
é de 176 bytes de comprimento, eu não entendi sua contagemfor
chamada:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Python -
200189Leva a entrada como argumentos de função para a, grava o resultado em stdout como arquivo pgm.
n
é iterações,s
é ponto de partida,r
é r ez
é uma lista de pontos de entrada.Editar: não desenha mais pontos de entrada em cinza.
Resultados interessantes:
fonte
p=[255]*360000
podem ser parâmetros opcionais para a função; o corpo de um loop for pode continuar na mesma linha se não tiver fluxo de controle; você pode raspar parênteses de[1]*(n+1)
como[1]*-~n
; como você não usai
no loop for externo, é mais curto executar o código asn
vezes queexec"code;"*n
); Eu acho que os parêntesesfor i in(0,1)
podem ser removidos.SuperCollider - 106
O SuperCollider é um idioma para gerar música, mas pode fazer gráficos rapidamente.
Usei alguns atalhos de sintaxe obscuros para economizar alguns bytes - uma versão mais legível e mais eficiente de memória é
a 109 caracteres.
Como no exemplo do Mathematica, você deve redimensionar manualmente a janela para obter 600x600 pixels. Você precisa esperar que ele seja redesenhado novamente ao fazer isso.
Isso gera um triângulo básico de Sierpinsky (não mostrado porque você já viu isso antes)
Isso faz uma espécie de coisa do tipo pentágono de Sierpinsky:
A mesma coisa com 6 pontos deixa um floco de neve Koch invertido no meio:
Finalmente, aqui está um riff sobre as pirâmides 3D da resposta do ás. (Observe que eu usei um dos pontos duas vezes para obter o efeito de sombreamento.)
fonte
Python,
189183175Editar: corrigiu a taxa de inversão de r e mudou para a imagem em preto e branco, a fim de economizar alguns bytes.
Toma o número de pontos como
n
, primeiro ponto comop
, razão comor
e lista de pontos comol
. Precisa do módulo Pillow.Exemplos:
Estou gerando pontos em círculo ao redor do centro da imagem
Repetições XOXO, apenas alterando a proporção de 0,4 para 0,6
Algum tipo de floco de neve
fonte
n,p,r,l=input()
. Você também pode remover os colchetes das*=
operações e usarimport random as R
.*=
:(.input
Seria bom ser muito desagradável de se trabalhar, e a importação atualmente é a forma mais concisa possível (ou eu perdi alguma coisa?).import random as R,PIL.Image as I
e entãorandom.choice
pode serR.choice
. Sim, o uso da entrada é ruim, mas você pode usar a versão da função para testar e publicar a versão parainput()
obter uma pontuação melhor !! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Fico feliz em receber algum feedback sobre o meu script e sobre o golfe, pois não me sinto à vontade com o JS =).
Leitura de entrada (para ser comparável à entrada de edc65 , não conto a entrada.):
Configuração e cálculo do Canvas
Um pouco mais desregrado (incluindo um exemplo de entrada em que os prompts de entrada reais são apenas comentados e prontos para uso):
Exemplos
fonte
Processamento, 153
Portou a resposta Java do @Geobits para o Processing e jogou mais golfe, resultando em uma redução de 100 caracteres. Originalmente, pretendia animar o processo, mas as restrições de entrada são muito duras com isso (o Processing não possui stdin ou argv, o que significa que devo escrever minha própria função em vez de usar o
draw()
loop nativo do Processing ).Programa completo com quebras de linha:
O programa acima fornece Crosses:
Isso dá às pirâmides:
Isso dá o triângulo de Sierpinski:
fonte
"Implementação de referência" ungolfed, Python
Atualização : muito, muito mais rápida (por ordens de magnitude)
Confira o shell interativo!
Edite o arquivo e defina
interactive
comoTrue
, e siga um destes procedimentos:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
gera, salva e exibe um polígono.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
faz o que a especificação pede.fonte
Python (202 caracteres)
Toma o número de pontos como
n
, o peso médio comor
, o ponto inicial como atuple
s
e a lista de pontos como uma lista dos XYtuple
s chamadosl
.fonte