Как генерировать такие случайные кривые? - PullRequest
6 голосов
/ 12 июля 2011

Возможно ли генерировать такие случайные кривые?

enter image description here

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

Спасибо.

Ответы [ 3 ]

5 голосов
/ 12 июля 2011

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

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

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

4 голосов
/ 12 июля 2011

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

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

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

Two example curves generated this way.

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

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

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

3 голосов
/ 12 июля 2011

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

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;
}

enter image description here

...