Как генерировать подобные случайные кривые?

Можно ли генерировать подобные случайные кривые?

введите описание изображения здесь

Я пробовал кривые IMagick bezier (см. Http://www.php.net/manual/en/function.imagickdraw-bezier.php ), но даже с 20-30 очками они выглядят не так. Вот мой пример http://mechanicalzilla.com/sandbox/imagick/curve.php

Спасибо.

Бьюсь об заклад, вы могли бы написать алгоритм, который в основном принимал бы x число случайных поворотов, прежде чем идти прямо к координатам выхода. Это также предполагает, что алгоритм достаточно умен, чтобы проверить угол поворота. (предполагая, что вы не хотите заканчивать в узловой сети)

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

Даже если вам удастся создать алгоритм с одной строкой, сделать так, чтобы линии не приближались друг к другу, почти невозможно. Вы получите что-то вроде этого: горец веб

Это далеко не полный ответ, но, как мне кажется, он может помочь вам:

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

Случайность вступает в игру, выбирая квадрат кривой – чтобы он не становился слишком хаотичным, вы могли бы дать эту случайность, скажем, «вам не разрешено выбирать квадрат (если расстояние от квадрата до квадрата считается 1 ) нарушает abs(current vertical position - new vertical position) <= 5 если ни одно из них не является бесплатным больше в данный момент »или какое-либо другое произвольное ограничение. («если ни одно из них не является бесплатным больше на данном этапе», важно, иначе можно заблокировать себя в неразрешимом состоянии.)

Таким образом генерируются две примерные кривые.

(Извините, рисование кривых с помощью мыши -> худшая / не интерполяция никогда. Интерполяция Catmull-Rom, вероятно, будет вашим другом здесь, хотя, я думаю.)

Дисплей должен быть достаточно свободным, так как ваши кривые точки не могут произвольно рассеиваться вместе с сеткой, но, вероятно, очень сложно заставить кривую подключиться к конечной точке «текучим» – может быть хорошим решением, если вы не возражаете произвольно конечные точки, однако, считанные как, алгоритм может решить для себя, где он хочет, чтобы линия заканчивалась.

Думаете, эта идея может помочь вам с вашими кривыми?

Выглядит как:

 x = 0; y = 0; angel = 0; while (true) { angel = angel + 0.5 - random(1); x1 = x + 0.1 * cos(angel); y1 = y + 0.1 * sin(angel); if (abs(x1 - x) + abs(y1 - y) < 10) drawline(x,y,x1,y1); x = x1; y = y1; if (x < 0) x = width; if (y < 0) y = height; if (x > width) x = 0; if (y > height) y = 0; } 

введите описание изображения здесь