Tensorial
Tensorial
Tensorial
Tensorial
Tensorial
Tensorial

Весь алгоритм можно разделить на 3 части:

I. Инициализация

На этом этапе значения параметров выбираются случайным образом.
Например, количество линий, количество опорных точек для каждой оси и так далее. Сейчас нет смысла разбирать каждый параметр, я объясню их в Части 3 по ходу дела.

Tensorial

II. Построение линий

Все линии хранятся в списке объектов класса Line, который просто хранит начальную и конечную точки линии.
Построение линий происходит в цикле:Выбирается угол из списка углов (обычно в этом списке только 2-3 угла).Создается объект класса Line с центром в случайной точке под выбранным углом.Вычисляются все точки пересечения с ранее построенными линиями, затем находятся две ближайшие точки к центру исходной линии, и линия обрезается по этим двум точкам.

Tensorial

III. Деформация

Основная идея этой части — заменить обычные координаты x и y на деформированные. То есть для каждой точки (x, y) есть соответствующая точка (f(x, y), g(x, y)), где f(x, y) и g(x, y) — это функции деформации.В Части I одним из параметров были опорные точки для осей, они отвечают за конечный вид изображения.Вот код для функции f(x, y):

Tensorial

Сначала вычисляется среднее квадратичное расстояние до каждой из опорных точек.

Затем вычисляется угол нового вектора по формуле.

Аналогично происходит для оси y, только для нее используются другие опорные точки.

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

Tensorial

Не знаю как сюда код вставить))) Но проверил у себя, довольно интересно потыкать)))

Tensorial
Tensorial