Нужны идеи для алгоритма рисования неправильных пятнистых фигур

8

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

Yttermayn
источник
2
Я бы помог, если бы вы приложили несколько примеров таких фигур, но из того, что я понял, алгоритм Marching Squares может быть тем, что вы ищете.
Александр Константинов
Например, если серьезно, подумайте о пятнах на печени: округлые, случайные, но обычно яйцевидные.
Иттермайн
6
В этом посте mathematica.SE есть несколько примеров, которые могут вас заинтересовать: mathematica.stackexchange.com/questions/3345/… Главный ответ в основном делает то, что вы делаете. другой находит выпуклую оболочку случайных точек, а затем интерполирует через нее сплайн, но это кажется немного сложным ...
Джемми,
Спасибо за ваши ответы! К сожалению, я думаю, что могу быть немного над моей головой. Возможно, мне придется выяснить что-то еще.
Иттермайн
4
Как насчет того, чтобы начать с круга, близкого к нужному размеру, а затем переставить его, используя перлин-шум Либо путем перемещения выбранного пикселя, либо путем затухания / расширения круга.
2011 г.

Ответы:

1

Вы можете выбрать несколько точек, выбрать вектор в каждой точке и провести через них сплайн. См. Эту страницу википедии для простого описания кубического сплайна (он же сплайн Ирвина-Холла). Прошло много времени с тех пор, как я их использовал, но, если я правильно помню, это было то, что я нашел наиболее простым для понимания и использования. Если вы знаете инструмент «Перо» из фотошопа, он работает очень похоже (я уверен, что фотошоп тоже использует сплайны, но я не уверен, что это кубический сплайн).

Если вам интересно, есть еще много сплайнов: например, интересны сплайны Безье и B-сплайны.

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

Наборы уровней - это неравенства в форме
f (x, y) = c,
где f - некоторая функция, а c - некоторая постоянная.
Это очень общее описание. Возможно, вы захотите заполнить некоторую форму и нарисовать все пиксели, где
f (x, y) <= c,
с некоторым цветом. Например, для идеально круглой двумерной фигуры у вас есть хорошо известное уравнение:
x ^ 2 + y ^ 2 <= r ^ 2
Вы можете масштабировать компоненты x и y, чтобы получить эллипсоид. После небольших экспериментов и исследований, будет возможно найти некоторые более забавные формы (я полагаю).

Изменить: небольшой эксперимент на wolframalpha.com дал мне это . (создается командой 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Я понятия не имею, если это что-то вроде того, что вы хотите, но это просто, чтобы дать вам идею.

Ruben
источник
1

Другой простой подход - использование собственного низкочастотного шума для рисования (или определения) фигуры в полярных координатах.

Предположим, вам нужен шарик с центром в начале координат, среднего радиуса 1; это можно легко масштабировать и переводить в другие позиции и размеры. Представьте себе простое уравнение r = 1 - это определит круг радиуса один в начале координат. Чтобы добавить к этому небольшое изменение, вы можете изменить радиус синусоидально - добавьте член вида w 1 * sin (θ + θ 1 ), где w 1 и θ 1 - это константы, к которым я вернусь чуть позже. Один грешный термин не будет иметь большого значения, но наличие нескольких различных синусов разных частот начнет добавлять именно то «мягкое» изменение, которое, я подозреваю, вам нужно. Общая форма будет иметь вид r = 1 + w 1 * sin (θ + θ 1 ) + w2 * sin (2θ + θ 2 ) + w 3 * sin (3θ + θ 3 ) + w 4 * sin (4θ + θ 4 ) + w 5 * sin (5θ + θ 5 ) - или больше терминов, если хотите, конечно.

Так, как мы выбираем значения для w i и θ i ? Ну, θs следует просто выбирать случайным образом из (0,2π) - иными словами, каждая «волна» на форме поверхности должна начинаться в другой точке вокруг формы. Что касается W, есть несколько разных вариантов. Выбор w i случайным образом из (0, w) (для некоторого фиксированного w, который представляет «общее изменение» для придания формы; я мог бы начать с w = 0,25, но экспериментировать с w = 0,1) для каждого i приведет к такому называется белым шумом , где все частоты имеют одинаковый вес - это, безусловно, «самый большой», с широкими вариациями на всех частотах. Выбор w i случайным образом из (0, w * (1 / i)) - другими словами,шум, где вес умолкает, но медленно. Это также называется шумом 1 / f , и это самый известный «фрактальный» шум. Наконец, выбор весов случайным образом из (0, w * (1 / i ^ 2)) (другими словами, деление каждого случайного веса на i ^ 2) дает броуновский шум - это самый «мягкий» из трех, с Наименьшее отклонение от круга - обычно это будет овальная форма.

Вот примеры трех из них, используя «общий вес» w = 0,25 и используя тот же набор случайных значений для w i и θ i, извлеченных из random.org :

«Белый шум»: Капля с белым шумом

Blob "Розовый шум": Капля с розовым шумом

BLOB-объект «Броуновский шум»: Капля с броуновским шумом

Обратите внимание, что эти капли не будут идеальными; в частности, они не могут свернуться сами (поскольку для каждого θ - другими словами, для каждого угла от начала координат - есть единственное значение r), и если вы не выберете правильные веса, они могут самостоятельно пересекаются (если r разрешено идти отрицательным). Но они отлично справляются со своей работой, и для большинства игровых приложений пользователи не заметят никаких проблем.

Стивен Стадницки
источник
(Также обратите внимание: тот факт, что эти формы очень близки к симметричному, является артефактом: (а) коэффициенты второй и четвертой гармоник настолько малы, и (б) фазы первой, третьей и пятой гармоник - насколько мы смещаем тэта-значения - так близко, на .468, .464 и .443; у большинства «пятен» не будет почти такой же симметрии относительно них.)
Стивен Стадницки,
0

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

Если вы хотите, чтобы ваш код был быстрым, вы можете просто использовать библиотеку генерации шума, такую как libnoise (при условии, что вы используете c ++), которая является библиотекой генерации шума, которая делает подобные задачи очень простыми, так как предоставляет вам узел подход к процессуальной генерации на основе шума. У него есть привязки и к другим языкам.

akaltar
источник