Algoritmo para Clima Aleatório


8

Estou tendo dificuldades para modelar o clima. Modelar um único aspecto é trivial - algum padrão sinusoidal + ruído aleatório. No entanto, mais de 1 está me deixando louco. Não posso ter vento, folhas caindo, chuva e neve, tudo para ser aleatório. Colisões simples como chuva e neve nunca devem acontecer.

Além disso, eu gostaria de um nível de "intensidade" para talvez cada um. Mas isso pode vir após a lógica principal.

O tempo é armazenado no MySQL.

Todas as suas sugestões são bem-vindas, mas não sugerimos pingar um código postal e retirar o tempo a partir daí.


Utilizando sugestões de, na verdade, todas as respostas abaixo, criei esta distribuição não em escala :

Modificadores de clima em função da semana do ano

Cada recurso será calculado com um ruído aleatório e a combinação dos 3 produzirá efeitos de sobreposição.

(temperatura <0) e (úmido> 65) => neve


5
A propósito, neve + chuva são um tempo válido.
Kromster

11
Bem, não estará no meu jogo. :-D
Mikhail

11
A neve não é apenas o resultado da chuva + temperatura baixa?
Philipp

Respostas:


9

Que tal dividir o clima em partes mais detalhadas?

Precipitation - none/light/moderate/heavy
Wind - none/light/moderate/heavy
Type - rain/hail/snow

Você ainda pode armazená-lo em uma única coluna SQL, se desejar, tornando-o um enum simples com 48 (4 * 4 * 3) valores possíveis (removendo quaisquer conflitos estranhos que você não goste).


7
Eu estaria pensando em dividir em "temperatura", "vento" e "umidade". Estes poderiam então ser interpretados como implicando chuva / granizo / neve / etc, sem nunca ter um conflito.
Trevor Powell

7

Parece que um modelo Markov oculto pode ser útil para você. Eles definem certos estados com probabilidades estatísticas de transições de um estado para cada um dos outros estados com base na frequência relativa das observações.

Você pode definir alguns estados climáticos, por exemplo, 'chuvoso' e 'ensolarado' e probabilidades de transições de chuvoso para ensolarado e ensolarado para chuvoso e calcular, por exemplo, a probabilidade de que em breve chova com base em sua observação de se está ensolarado ou chuvoso no momento . O artigo da Wikipedia explica isso, mas este tutorial (PDF) mostra uma abordagem mais prática.

Se você estiver modelando muitos padrões climáticos diferentes, seria difícil modelá-los independentemente com esse padrão, mas você pode definir o clima como 'FogRain' ou 'WindSnow' 'SunWind' 'Sun' por exemplo e ter probabilidades para cada um. Essas probabilidades podem até ser modificadas com base no mês do jogo, por exemplo. Há um pequeno problema a ser observado, no entanto, de que o tamanho da sua matriz de probabilidade aumentará em n ^ 2 à medida que você adiciona mais tipos climáticos, pois cada um precisa ter probabilidades de transição (mesmo que sejam zero) para os outros.


Modelo de Markov, não HMM.
Peter Taylor

Marcado com simplicidade. Ter algo simples, ajustável e compreensível é muito melhor do que ter algo preciso e complexo. Além disso, você sempre pode torná-lo mais sofisticado, se quiser, e fazer com que as probabilidades de transição dependam de algo (altitude, bioma local etc.).
Michael

Embora eu goste disso, é um pouco inconveniente, pois outros desenvolvedores precisariam pensar em transições em probabilidades. Combinado com o fato de que o clima é time-of-the-ano dependente, modelo Markov faria coisas provavelmente complicar
Mikhail

Talvez eu entenda mal sua sugestão. Para cada mês eu teria que ter uma tabela n ^ 2 de probabilidades de transição, certo? Onde N é o 2 ^ W de todas as condições climáticas. Assim, ter 3 modelos de tempo eu teria 64 probabilidades para um único mês
Mikhail

@ Mikhail para cada mês, você teria uma tabela de probabilidades de transição de cada condição climática para outra condição, mas isso não necessariamente precisa ser N ^ 2 na complexidade do espaço, pois não precisa ser uma matriz (poderia seja uma estrutura gráfica cíclica com cada ramo apontando para um dos próximos valores da cadeia com uma probabilidade anexada). Não é tão difícil de conceituar, mas talvez você queira dividi-lo a cada 2-3 meses, e não a cada mês. Este artigo é melhor do que o que eu vinculei anteriormente, pode ajudar mais!
Martin Foot

4

Em resumo..

Eu estaria pensando isso através da ciência.

Como todos sabemos, a neve é ​​chuva e vice-versa, exceto que eles têm estados sólidos diferentes devido a mudanças de temperatura.

As mudanças de temperatura podem ser associadas aos ventos.

Um rápido Google para "o que causa o vento" me deu uma resposta do Answers.com:

"A força do gradiente de pressão, que surge do aquecimento desigual da superfície da Terra. Uma vez em movimento, a força de Coriolis surge da rotação da Terra para desviá-la (à direita no hemisfério norte, à esquerda no hemisfério sul)".

Sim, não é a melhor fonte para questões científicas, mas dá a ideia.

Então, teoricamente, você só precisa de vento agora. Pode ser aleatório ou, de alguma forma, pode ser de alguma forma programado para o seu ambiente, que é aquecido devido a alguns eventos.

Aprecie o vento agora, aplique na sua posição atual e, aleatoriamente ou através de um script, faça nuvens dela. Quanto mais densa a nuvem, maior a probabilidade e a densidade da chuva. Se a temperatura estiver baixa o suficiente, a chuva se tornará neve. Mova a nuvem e torne-a "não tão densa" com esse vento.

Quanto à tela, depende de você, apenas armazene em cache os estados das partículas que caem if rain -> use water drop texturee if snow -> use snowflake texture. Use o vento para fazer essas partículas se moverem de acordo com a direção do vento (sim, você deve armazenar esta também em algum lugar) para torná-la um pouco mais realista.

E com isso você pode expandir tudo. Por exemplo, se houver neve caindo e os flocos de neve caírem perto de algum tipo de fonte de calor, altere a textura das partículas para chover novamente.

Muitas possibilidades, na verdade, este é apenas um conceito simples.

PS Quanto ao granizo, veja o que os torna, expanda o conceito para esse ambiente.

Divirta-se, boa sorte.

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.