Precisa de idéias para um algoritmo desenhar formas irregulares e manchadas


8

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!


2
Eu ajudaria se você anexasse alguns exemplos de tais formas, mas pelo que entendi, o algoritmo Marching Squares pode ser o que você está procurando.
Alexander Konstantinov

Por exemplo, com toda a seriedade, pense em manchas no fígado: arredondadas, aleatórias, mas geralmente ovóides.
Yttermayn

6
Esta publicação do mathematica.SE tem alguns exemplos que você pode achar interessantes: mathematica.stackexchange.com/questions/3345/… A resposta principal basicamente faz o que você está fazendo. outros achados do casco convexo de pontos aleatórios e, em seguida, interpola um spline através dele, mas que parece um pouco complicado ...
Jemmy

Obrigado por suas respostas! Infelizmente, acho que posso estar um pouco acima da minha cabeça. Talvez eu tenha que descobrir outra coisa.
Yttermayn

4
Que tal começar com um círculo próximo ao tamanho desejado e permutá-lo usando o ruído permanente. Movendo o pixel selecionado ou desbotando / estendendo o círculo.
floar

Respostas:


1

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.


1

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": Uma bolha feita com ruído branco

Blob "Pink Noise": Uma bolha feita com ruído rosa

Blob "Ruído browniano": Uma bolha feita com 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.


(Observe também: o fato de essas formas serem tão próximas da simétrica é um artefato de (a) os coeficientes do segundo e quarto harmônicos sendo tão pequenos e (b) as fases do primeiro, terceiro e quinto harmônicos - quanto deslocamos os valores teta - estar tão perto, em 0,468, 0,464 e 0,443, a maioria das 'bolhas' não terá quase tanto simetria sobre eles).
Steven Stadnicki

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.