LINUX.ORG.RU

Сгенерировать псевдослучайную кривую (наподобие линии горизонта+крон деревьев)

 машграф


0

1

Мне это нужно для замены hand-made рисунка векторной графикой.
Размер нового векторизованного рисунка может быть произвольным.
Как бы это реализовать на JavaScript?

Я так полагаю, алгоритм не обязательно должен быть фрактальным (так
как размер деревьев и неровностей ландшафта - пропорционален
размеру рисунка, то есть деревья будут одного и того же
относительного размера).

На вход задается: точка старта (линия горизонта слева) и точка
останова (линия горизонта справа), нужно их соединить
псевдослучайной кривой, достаточно красивой. И ещё - чтобы эта
кривая не вылезала по Y за [y1,y2].

Мне вспоминается книжка по стохастической геометрии. Но опыта её использования нету.
Желательно, чтобы алгоритм был детерминированным, а не рандомным -
чтобы линия горизонта полностью определялась некоторой переменной типа integer.

Подскажите, куда копать. Времени на реализацию - один-два дня.

★★★★★

В GIMP'е такое можно делать с контуром - «Исказить».

pacify ★★★★★
() автор топика

Желательно, чтобы алгоритм был детерминированным, а не рандомным -

чтобы линия горизонта полностью определялась некоторой переменной типа integer.

Задаёшь таблицу размерностью INT_MAX, каждое вхождени в которой - уникальный векторный рисунок горизонта. И АПИ из одной функции, выбирающей N-ое вхождение из этой таблицы.

anonymous
()
Ответ на: комментарий от anonymous

каждое вхождени в которой - уникальный векторный рисунок горизонта

хм ... в принципе, сойдёт. Сделать линию горизонта зеркально симметричной. Точка входа у меня на одном уровне с точкой выхода (Y1 = Y2).

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Зачем симметричной? Чтобы уменьшить размер таблицы? Тогда можно просто артефакты перечислить, а вызывающий код сможет их выбирать их случайным (или неслучайным) порядком, может и масштабировать в каких-то пределах.

anonymous
()

на JavaScript

Да уж, это — задачка не из простых…

Eddy_Em ☆☆☆☆☆
()

Рандомный фрактальный алгоритм это как раз самое простое - берем источник с равномерным распределением выдающий числа в заданном диапазоне (обычный рандом), дальше делим ровную линию горизонта пополам, серединку двигаем источником по вертикали, потом каждый отрезок (с учетом получившегося наклона) еще раз пополам и уменьшаем диапазон источника и т.д. пока не надоест. Источник желательно делать симметричным [-a:a], можно брать гаусса и отрезать ему хвосты.

Мы так в 2D границу Мохо деформировали для сейсмики, в игрушках так ландшафты генерят вроде - в общем типовой такой алгоритм, очень аутентичные картинки выходят.

ЗЫ вот с детернменизмом (повтофремостью) сложнее. Но тут или случ источник не надо инициализировать, что бы каждый раз одна и та же последовательность была, либо брать какую нить хитрую либу типа Random123 - но для Ваших целей это ИМНО уже лишнее.

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Я конечно не знаю JS... но таблица размером INT_MAX вызывает у меня смутные сомнения. И главное, я не очень понял откуда в этой таблице возьмется INT_MAX уникальных векторных рисунков горизонта;-)

Кстати, man srandom - что то мне подсказывает, что если в JS есть рандом, то он инициализируется целым числом, которое как раз и будет однозначно задавать получившуюся линию горизонта, потому как random из stdlib последовательность псевдослучайная.

AIv ★★★★★
()
Ответ на: комментарий от AIv

таблица размером INT_MAX вызывает у меня смутные сомнения

Там хватит ~256 значений.

я не очень понял откуда в этой таблице возьмется INT_MAX уникальных векторных рисунков горизонта;-)

Ручками нарисуется.

man srandom

Есть куча способов «улучшить случайность».

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ручками нарисуется

Т.е. реализовать один раз нормальный алгоритм в JS это сложнее чем рисовать 256 разных векторных ландшафтов РУКАМИ + реализовывать код для их загрузки/выгрузки из таблицы О_О???

Есть куча способов «улучшить случайность».

В данном случае случайности более чем достаточно.

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от AIv

реализовать один раз нормальный алгоритм в JS это сложнее чем рисовать 256 разных векторных ландшафтов РУКАМИ + реализовывать код для их загрузки/выгрузки из таблицы О_О???

Ну так это — примерно как четность считать. Можно для каждого символа вызывать функцию вычисления количества бит (подумаешь: мощей-то до фига), а можно затабулировать раз и навсегда (тогда даже в JS можно будет четность считать).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Есть небольшая разница - таблица четность генерится один раз автоматом и кладется в файл. С ландшафтами вообще то сложнее, Если даже JS не пригоден для реализации фрактального алгоритма (во что я не верю, вона какие форточки в вебне на нем лабают), то все равно как то эти ландшафты придется генерить для таблицы, пусть и на другом ЯП. Руками рисовать это... даже не смешно.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Дык, я не имел ввиду прямо брать и рисовать. Генерировать, ясен пень. Но на нормальном ЯП, а не тормозном JS в глючном браузере.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

извините за офтоп, уже с оп поста вспомнилась картинка с покрышкой на дереве. надо всего лишь контуры деревьев а тут такой-то compilcated, жую попкорн, продолжайте

trashymichael ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.