Генерация случайных точек для построения процедурной линии - PullRequest
1 голос
/ 29 мая 2011

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

enter image description here

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

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

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

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

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

enter image description here

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

1 Ответ

4 голосов
/ 29 мая 2011

Вот некоторый код на 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

В примере нет смещения, т. Е. У может изменяться симметрично вверх или вниз.Если вы хотите, чтобы ваш «пьяный» имел тенденцию к большему «спуску», вы можете изменить смещение после вызова на случайное с 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:

enter image description here

...