Estou procurando desenhar formas irregulares em uma grade x, y e gostaria de criar um método simples e rápido, se possível. Até agora, minha única idéia é desenhar um monte de círculos de tamanhos aleatórios muito próximos um do outro, mas a uma distância aleatória de uma coordenada mais ou menos central e preencher todos os espaços em branco. Sei que esse é um método deselegante e deselegante, espero que ele lhe dê uma idéia aproximada dos tipos de formas arredondadas e aleatórias que eu estou procurando. Por favor, sugira métodos para fazer isso, não estou muito interessado em código. Eu posso macarrão essa parte sozinho. Obrigado!
2d
algorithm
random
procedural
Yttermayn
fonte
fonte
Respostas:
Você pode escolher alguns pontos, escolher um vetor em cada ponto e desenhar um spline através deles. Consulte esta página da Wikipedia para obter uma descrição simples de um spline cúbico (também conhecido como spline Irwin-Hall). Já faz um tempo desde que eu os usei, mas se bem me lembro, esse foi o mais fácil de entender e usar. Se você conhece a ferramenta caneta do photoshop, isso funciona muito semelhante (estou convencido de que o photoshop também usa splines, mas não tenho certeza se é um spline cúbico).
Se você estiver interessado, há muito mais splines: por exemplo, splines de Bezier e splines B são interessantes.
Outra coisa que vem à mente são os conjuntos de níveis, embora isso provavelmente exija um pouco mais de pesquisa do seu lado (para encontrar funções que atendam aos seus requisitos).
Conjuntos de níveis são desigualdades na forma
f (x, y) = c
onde f é alguma função ec é constante.
Esta é uma descrição muito geral. Você pode preencher alguma forma e desenhar todos os pixels em que
f (x, y) <= c
com alguma cor. Por exemplo, para uma forma 2d perfeitamente redonda, você tem a equação conhecida:
x ^ 2 + y ^ 2 <= r ^ 2
Você pode dimensionar os componentes xey para obter um elipsóide Com um pouco de experimentação e pesquisa, ele será possível encontrar algumas formas mais engraçadas (suponho).
Edit: um pouco de experimentação em wolframalpha.com me deu isso . (criado com o comando 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Não faço ideia se é algo parecido com o que você deseja, mas é apenas para lhe dar uma ideia.
fonte
Outra abordagem direta é usar seu próprio ruído de baixa frequência para desenhar (ou definir) uma figura em coordenadas polares.
Suponha que você queira um blob centralizado na origem, com raio médio 1; isso pode ser facilmente dimensionado e traduzido para outras posições e tamanhos. Imagine com a equação simples r = 1 - isso definiria um círculo de raio um na origem. Para adicionar uma pequena variação a ele, você pode alterar o raio sinusoidalmente - adicione um termo da forma w 1 * sin (θ + θ 1 ), onde w 1 e θ 1 são constantes às quais eu voltarei daqui a pouco. Um termo pecado não vai fazer um monte de diferença, mas ter vários diferentes senos de diferentes frequências vão começar a juntar exatamente o tipo de variação 'soft' Eu suspeito que você está depois. A forma geral seria ao longo das linhas de r = 1 + w 1 * sin (θ + θ 1 ) + w2 * sin (2θ + θ 2 ) + w * sin (5θ + θ 5 ) - ou mais termos, se desejar, claro.3 * sen (3θ + θ 3 ) + w 4 * sin (4θ + θ 4 ) + w 5
Então, como escolhemos os valores para w i e θ i ? Bem, os θs devem ser escolhidos aleatoriamente a partir de (0,2π) - em outras palavras, cada 'onda' na forma da superfície deve começar em um ponto diferente ao redor da forma. Quanto aos w, existem várias opções diferentes. Escolhendo w i aleatoriamente de (0, w) (para alguns w fixos que representam a 'variação geral' para dar a forma; eu poderia começar com w = 0,25, mas experimentar com w = 0,1) para cada i levará a chamado ruído branco , onde todas as frequências têm peso igual - este é de longe o mais blobbiest, com amplas variações em todas as frequências. Escolhendo w i aleatoriamente entre (0, w * (1 / i)) - em outras palavras, ruído , onde o peso diminui, mas lentamente. Isso também é conhecido como ruído 1 / f , e é o ruído 'fractal' mais famoso. Por fim, escolhendo os pesos aleatoriamente entre (0, w * (1 / i ^ 2)) (em outras palavras,browniano ruído - esse é o 'mais suave' dos três, com o menor variação de um círculo - geralmente será uma forma ovalada.
Aqui estão exemplos dos três, usando um 'peso total' de w = 0,25 e usando o mesmo conjunto de valores aleatórios para w i e θ i extraídos de random.org :
Blob "Ruído branco":
Blob "Pink Noise":
Blob "Ruído browniano":
Observe que esses blobs não serão perfeitos; em particular, é impossível que eles se curvem (já que para cada θ - em outras palavras, para todos os ângulos da origem - existe um único valor r), e se você não escolher seus pesos corretamente, eles poderão intersect (se r for permitido que seja negativo). Mas eles fazem um trabalho decente de serem convincentemente descarados e, na maioria dos aplicativos de jogos, os usuários não notam nenhum problema.
fonte
Além das outras respostas, você pode usar um ruído Perlin com uma queda circular; se você ajustar um pouco as configurações, poderá criar facilmente algumas formas agradáveis e variadas.
Se você deseja que seu código seja rápido, basta usar uma biblioteca de geração de ruído como libnoise (supondo que você esteja usando c ++), que é uma biblioteca de geração de ruído, que torna tarefas semelhantes muito simples, pois fornece um nó abordagem baseada na geração de procedimentos baseados em ruído. Também possui ligações para outros idiomas.
fonte