Алгоритм рандомизированной погоды


8

Мне трудно моделировать погоду. Моделирование одного аспекта тривиально - некоторый синусоидальный паттерн + случайный шум. Однако больше чем 1 поражает воображение. У меня не может быть ветра, падающих листьев, дождя и снега, чтобы быть случайным. Простые столкновения, такие как дождь и снег, никогда не должны происходить.

Кроме того, я бы хотел уровень «интенсивности» для каждого. Но это может прийти после основной логики.

Погода хранится в MySQL.

Все ваши предложения приветствуются, но, пожалуйста, не предлагайте пинговать какой-либо почтовый индекс и указывать погоду оттуда.


Используя предложения, фактически, из всех приведенных ниже ответов, я пришел с этим не масштабным распределением:

Модификаторы погоды как функция недели года

Каждая функция будет вычисляться со случайным шумом, а комбинация из 3 создаст эффекты наложения.

(температура <0) и (влажность> 65) => снег


5
Кстати, снег + дождь - это действительная погода.
Кромстер

1
Ну, это не будет в моей игре. :-D
Михаил

1
Разве снег не является результатом дождя + низкой температуры?
Филипп

Ответы:


9

Как насчет разделения погоды на более подробные части?

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

Вы все еще можете сохранить это в одном столбце SQL, если хотите, сделав его простым перечислением с 48 (4 * 4 * 3) возможными значениями (удаляя любые странные конфликты, которые вам не нравятся).


7
Я думаю о разделении на «температуру», «ветер» и «влажность». Затем их можно интерпретировать как подразумевающие дождь / град / снег / и т. Д., Без конфликтов.
Тревор Пауэлл

7

Похоже, что Скрытая Марковская Модель может быть полезна для вас. Они определяют определенные состояния со статистическими вероятностями переходов из одного состояния в каждое из других состояний на основе относительной частоты в наблюдениях.

Вы можете определить некоторые погодные состояния, например, «дождливое» и «солнечное», а также вероятности перехода от дождливого к солнечному и от солнечного к дождливому, а также рассчитать, например, вероятность того, что скоро будет дождь, на основе ваших наблюдений, является ли в настоящее время солнечным или дождливым , Статья Википедии объясняет это , но это руководство (PDF) показывает более практический подход.

Если вы моделируете множество различных погодных моделей, было бы трудно смоделировать их независимо с этим шаблоном, но вы можете определить погоду, например, «FogRain» или «WindSnow», «SunWind», «Sun» и иметь вероятности для каждого. Эти вероятности могут быть даже изменены, например, в зависимости от игрового месяца. Однако следует помнить о небольшой проблеме, заключающейся в том, что размер вашей вероятностной матрицы будет увеличиваться на n ^ 2 по мере того, как вы добавляете больше типов погоды, поскольку каждый из них должен иметь вероятности перехода (даже если они равны нулю) для других.


Марковская модель, а не HMM.
Питер Тейлор

+1 для простоты. Иметь что-то простое, настраиваемое и понятное намного лучше, чем иметь что-то точное и сложное. Кроме того, вы всегда можете сделать его более красивым, если хотите, и сделать так, чтобы вероятности перехода зависели от чего-либо (высота, местный биом и т. Д.).
Майкл

Хотя мне это нравится, это немного неудобно, так как другим разработчикам придется задуматься о переходах в вероятности. В сочетании с тем фактом, что погода зависит от времени года, марковская модель, вероятно, усложнит ситуацию
Михаил

Возможно, я неправильно понимаю ваше предложение. На каждый месяц мне нужно иметь n ^ 2 таблицы вероятностей переходов, верно? Где N - 2 ^ W всех погодных условий. Таким образом, имея 3 модели погоды, у меня было бы 64 вероятности в течение одного месяца
Михаил

@Mikhail для каждого месяца у вас будет таблица вероятностей перехода от каждого погодного условия к другому, но это не обязательно должно быть N ^ 2 по сложности в пространстве, поскольку это не обязательно должна быть матрица (может быть структурой циклического графа с каждой ветвью, указывающей на одно из следующих значений в цепочке с прикрепленной вероятностью). Это не так сложно для концептуализации, но, возможно, вы хотели бы разделить его на каждые 2-3 месяца, а не на каждый месяц. Эта статья лучше, чем та, на которую я ссылался ранее, может помочь больше!
Мартин Фут

4

Короче говоря..

Я бы думал об этом через науку.

Как мы все знаем, снег - это дождь и наоборот, за исключением того, что они имеют различные твердые состояния из-за изменений температуры.

Изменения температуры могут быть связаны с ветрами.

Быстрый Google для "что вызывает ветер" дал мне ответ от Ответов:

«Сила градиента давления, возникающая из-за неравномерного нагрева земной поверхности. Как только она движется, сила Кориолиса возникает из-за вращения Земли с целью ее отклонения (прямо в северном полушарии, слева в южном полушарии)».

Да, не лучший источник для научных вопросов, но это дает идею.

Итак, теоретически, вам нужен только ветер сейчас. Это может быть случайным, или, может быть, как-то написано в вашей среде, которая нагревается из-за некоторых событий.

Поднимите ветер прямо сейчас, примените к вашей текущей позиции и случайным образом или с помощью сценариев сделайте из него облака. Чем плотнее облако, тем больше вероятность и плотность дождя. Если температура достаточно низкая, дождь превращается в снег. Переместите облако вокруг и сделайте его "не таким плотным" с этим ветром.

Что касается дисплея, это ваше дело, просто кешируйте состояния падающих частиц, if rain -> use water drop textureи if snow -> use snowflake texture. Используйте ветер, чтобы заставить эти частицы двигаться в соответствии с направлением ветра (да, вы должны хранить это тоже где-нибудь), чтобы сделать его немного более реалистичным.

И с этим вы можете расширить на все. Например, если падает снег, а снежинки падают рядом с источником тепла, снова измените текстуру частиц на дождь.

На самом деле множество возможностей, это просто простая концепция.

PS Что касается града, посмотрите, что делает это, расширьте понятие для такой среды.

Веселись, удачи.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.