Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2013, 03:23   #1
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию Шум Перлина(Pelin Noise)

Здравствуйте, помогите пожалуйста алгоритм генерации шума Перлина.
Цитата:
В каждой точке на сетке строится случайный вектор нормали. Это обычный двумерный вектор единичной длины, который указывает в случайном направлении в пределах каждого из квадратов. Традиционный способ создания таких векторов – организация справочной таблицы из 256 векторов, которые охватывают полный круг, и последующий случайный выбор одного из них для каждой точки на сетке. Это гарантирует распределение векторов, которые могут с равной вероятностью указывать в любом направлении. Далее для каждого пиксела изображения находится та из ячеек сетки, где он находиться. Таким образом, определяется значение, которое основано исключительно на данных этой ячейки. Следующий шаг – создать четыре диагональных вектора, соединяющих углы ячейки с текущим пикселом.



Каждый угол ячейки сетки теперь является базой для двух векторов – случайного единичного вектора и вектора в направлении пиксела, который необходимо построить. Для каждой пары таких векторов находиться скалярное произведение. Оно даст скалярное значение высоты каждого из углов сетки. Далее необходимо объединить эти четыре значения и найти высоту пиксела, который надо сгенерировать. Делать это можно по-разному, получая различные результаты, однако чаще всего используется взвешенная интерполяция четырех значений с учетом близости текущей позиции к каждому углу сетки.

Основным плюсом использования шумовой функции при генерации ландшафта является то, что нет необходимости хранить карту высот, а достаточно лишь использовать данные справочной таблицы векторов, – все остальное для восстановления конечной карты высот ландшафта сделает шумовая функция.
Как построить сетку я вроде бы понял, но я не знаю как определить, что пиксель принадлежит ячейки, но проблема даже не в этом. Я не понимаю, какие значения у нас получатся после нормализации результатов скалярного произведения векторов. Помогите пожалуйста я вам буду очень благодарен.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 24.02.2013, 11:12   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вы сами поняли отквоченный фрагмент?
Если "да", то сильно подозреваю, что Вы располагаете некоторой информацией, отсу3тствующей в этом фрагменте.
Например, не указана даже размерность пространства.
Термин "пиксель" не имеет никакого отношения к сетке, и никаких связей между одним и другим в условии не содержится.
Неизвестный термин - "диагональный вектор".
Что такое "высота узлов сетки"?
Что подразумевается под "объединить значения четырех векторов"? Это какая-то математическая операция?
Откуда вообще взялась "шумовая функция" в последнем абзаце? До этого о ней не было ни слова.
Ну и наконец, обоснование использование таблицы векторов вызывает некоторое сомнение: выбор [гарантированно] случайного направления вектора легко реализуется и без таблицы, не требует дополнительной памяти, дополнительных вычислений, а также приводит с существенно более равномерному распределению, нежели выбор из всего-навсего 256 готовых значений.
И еще настораживает довольно "кривенькое" описание алгоритма, поразительно напоминающего билинейную интерполяцию.

В общем, IMHO данная постановка не полна и требует существенных уточнений и пояснений хотя бы для того, чтобы понять, о чем идет речь.
s-andriano вне форума Ответить с цитированием
Старый 24.02.2013, 12:29   #3
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Я с вами полностью согласен, описание алгоритма до ужаса убого. Но это самое лучшее что я смог найти в рунете. Поэтому я и попросил помощи здесь, в надежде, что кто-то сталкивался с реализацией этого алгоритма.
Может ссылка на источник поможет.
http://blog.wonderville.ru/procedural-perlin-noise/
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 24.02.2013, 15:07   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Демик Посмотреть сообщение
...в надежде, что кто-то сталкивался с реализацией этого алгоритма.
Я как раз сталкивался. Использовал его для генерации текстур.
Но все равно не понял, что именно нужно, и каким образом предполагается применить этот алгоритм к решению конкретной (кстати - какой?) задачи.
s-andriano вне форума Ответить с цитированием
Старый 24.02.2013, 15:21   #5
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Хочу понять как работает этот алгоритм и реализовать его на C#. Раз вы сталкивались, объясните пожалуйста, как он работает.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 24.02.2013, 15:47   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Любой алгоритм бывает не сам по себе, а для решения какой-либо определенной задачи. Поэтому лучше бы начать с формулировки того, что же Вам нужно.
Фактически смысл этого алгоритма состоит в том, чтобы при помощи генератора белого шума получить:
- розовый шум,
- при том такой, который циклично замыкается сам на себя.
Алгоритм заключается в том, чтобы рекурсивно делить отрезок пополам и при этом средней точке отрезка приписывать значение равное линейной интерполяции значения на концах отрезка плюс случайная величина, умноженная на масштабный множитель. При этом величина масштабного множителя уменьшается (обычно в геометрической прогрессии, хотя возможны варианты) с каждым шагом рекурсии.

Собственно, сам алгоритм не обязан быть рекурсивным - подойдет итерация и даже цикл.
s-andriano вне форума Ответить с цитированием
Старый 24.02.2013, 16:14   #7
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Алгоритм нужен для генерации текстуры. И то что вы написали это не алгоритм шума Перлина.
Цитата:
Градиентный шум - разновидность алгоритмов генерации шума, используемых в компьютерной графике для создания процедурных текстур. При генерации градиентного шума создается решётка случайных градиентов, которые затем интерполируются для получения значений в точках, лежащих между узлами решётки.
Один из первых алгоритмов генерации градиентного шума, известный как Шум Перлина, был создан Кеном Перлином (англ.) и опубликован в 1985 году.[1]
Цитата:
Шум Перлина — это градиентный шум, состоящий из набора псевдослучайных единичных векторов (направлениях градиента), расположенных в определенных точках пространства и интерполированных функцией сглаживания между этими точками. Для генерации шума Перлина в одномерном пространстве необходимо для каждой точки этого пространства вычислить значение шумовой функции, используя направление градиента (или наклон) в указанной точке.
Вот описание алгоритма шума Перлина.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шум Гаусса Євгеній Бєлік Мультимедиа в Delphi 8 06.01.2013 22:36
Шум от монитора. Ghost3 Компьютерное железо 20 08.12.2012 14:31
шум,турбуленция мята Общие вопросы C/C++ 0 07.03.2011 13:26
Информационный шум usersat Свободное общение 0 21.04.2009 17:46