Генерация случайных точек для построения процедурной линии

Я хочу генерировать очки случайным образом. По крайней мере, по оси Y должно быть ограничение. Позже я соединяю точки в линию, которая должна образовывать простую анимацию. Вы можете представить это как случайную прогулку пьяного человека, идущего в гору и под гору.

введите описание изображения здесь

Звучит очень просто. Я поискал в Интернете и обнаружил, что это можно сделать с помощью цепочки Маркова. Думаю, эта идея действительно интересна.

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

Однако я не могу найти ни одного примера этого алгоритма или исходного кода. Я только что нашел апплет, демонстрирующий алгоритм цепочки Маркова: http://www.probability.ca/jeff/java/unif.html

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

Я нарисовал пример

введите описание изображения здесь

Поэтому я хочу, чтобы линия продолжалась аналогичным образом. Есть впадины, уклоны ... они случайны, но случайность по-прежнему применяется к начальному состоянию линии. Вот почему я нашел здесь такую ​​интересную цепочку макров: http://www.suite101.com/content/implementing-markov-chains-a24146.


person Upvote    schedule 29.05.2011    source источник
comment
Пожалуйста, сформулируйте ваши требования более четко: должны ли расстояния по оси x быть случайными? Если да, то насколько случайно. Должны ли меньшие уклоны быть более вероятными или они должны быть каждый раз более вероятными, чем другие x?   -  person svick    schedule 29.05.2011
comment
ну, я хочу создать какую-то бесконечную строку. Представьте, что вы прокручиваете вправо по оси x, линия приближается со случайными фазами спуска и подъема. В качестве примера возьмем картинку. Если бы я принял это как вход для цепи Маркова, чтобы продолжить линию, он бы нарисовал линию таким же образом, как и вход ...   -  person Upvote    schedule 29.05.2011


Ответы (1)


Вот код на Lua:

absstepmax = 25
ymin = -100
ymax = 100
x = 0
y = 5
for i = 1, 20 do
    y = y + (math.random(2*absstepmax) - absstepmax - 1)
    y = math.max(ymin, math.min(ymax, y))
    x = x + 5
    print (x,y)
end

absstepmax ограничивает размер шага по оси Y на итерацию

ymin и ymax ограничивают степень y

В этом примере нет смещения, т.е. y может изменяться симметрично вверх или вниз. Если вы хотите, чтобы ваш "пьяный" склонялся больше "под гору", вы можете изменить смещение после вызова на случайное с absstepmax - 1 на absstepmax - 5 или с любым другим смещением, которое вам нравится.

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

Вот несколько примеров выполнения:

> absstepmax = 25
> ymin = -100
> ymax = 100
> x = 0
> y = 5
> for i = 1, 20 do
>>     y = y + (math.random(2*absstepmax) - absstepmax - 1)
>>     y = math.max(ymin, math.min(ymax, y))
>>     x = x + 5
>>     print (x,y)
>> end
5   4
10  22
15  37
20  39
25  50
30  40
35  21
40  22
45  12
50  16
55  16
60  12
65  -1
70  -8
75  -14
80  -17
85  -19
90  -25
95  -37
100 -59
> absstepmax = 25
> ymin = -100
> ymax = 100
> x = 0
> y = 5
> for i = 1, 20 do
>>     y = y + (math.random(2*absstepmax) - absstepmax - 1)
>>     y = math.max(ymin, math.min(ymax, y))
>>     x = x + 5
>>     print (x,y)
>> end
5   -2
10  -15
15  -7
20  1
25  1
30  12
35  23
40  45
45  43
50  65
55  56
60  54
65  54
70  62
75  57
80  62
85  86
90  68
95  76
100 68
> 

Окрашенный результат добавлен из OP:

введите описание изображения здесь

person Doug Currie    schedule 29.05.2011