如何生成这种随机曲线?

时间:2011-07-12 08:53:21

标签: php algorithm imagemagick curve

是否有可能产生这种随机曲线?

enter image description here

我尝试了IMagick bezier曲线(见http://www.php.net/manual/en/function.imagickdraw-bezier.php),但即使有20-30分,它们看起来也不像这样。这是我的样本http://mechanicalzilla.com/sandbox/imagick/curve.php

谢谢。

3 个答案:

答案 0 :(得分:5)

我打赌你可以编写一个算法,在直接进入出口坐标之前基本上会有x个随机扭曲。这也假设算法足够智能以检查转弯的角度。 (假设你不想在结网中结束)

然而,假设这不是你的毕业任务,或者你是按小时付费来处理这个问题,这将浪费时间,成功是非常值得怀疑的。

即使你设法生成单行算法,这样做也不会让线条彼此靠得太近。你最终会得到这样的结论:knot-web

答案 1 :(得分:4)

这远不是一个完整的答案,但在我看来,它似乎可以帮助你:

不是从整条线的起点到终点绘制曲线,而是考虑将板细分为均匀间隔的网格。网格中一列的每个正方形都有权在其中有一个曲线点,并且您将从左向右稳定前进(首先是为了简单起见)。

随机性会通过为曲线选取一个正方形来发挥作用 - 为了防止它变得过于混乱,你可以给出这种随机性界限,比如说,“你不能选择一个正方形(如果距离正方形到正方形被视为1)违反abs(current vertical position - new vertical position) <= 5,除非此时此类不再有任何“或其他任意约束”。 (“除非此时不再有任何此类免费”很重要,否则就有可能将自己锁定在一个无法解决的状态。)

Two example curves generated this way.

(抱歉,用我的鼠标绘制曲线 - >最差/没有插值。但是,我想,Catmull-Rom插值可能是你的朋友。)

显示应该足够宽松,因为你的曲线点不能在给定网格的情况下任意散射在一起,但是可能很难让曲线“流畅地”连接到终点 - 可能是如果你不介意任意的终点,这是一个很好的解决方案,但是,算法可以自己决定它想要行结束的位置。

认为这个想法可能对你的曲线有帮助吗?

答案 2 :(得分:3)

看起来像:

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