如何生成这种随机曲线?

6

你将需要许多散布在棋盘上的点数。 - Karoly Horvath
4个回答

5
我敢打赌,你可以编写一个算法,在到达出口坐标之前,会随机转动x次。这也假设该算法足够聪明,能够检查转弯的角度。(假设您不想陷入结网中)
然而,假设这不是您的毕业任务,或者您按小时计费来完成此项工作,那么这将是浪费时间,成功的可能性极小。
即使您设法生成单行算法,要使行之间不会过于接近几乎是不可能的。您最终会得到像这样的东西: knot-web

4

看起来像:

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


4
这并不是一个完整的答案,但在我看来似乎可以帮助你:
不要从整条线开始到终点画曲线,而是考虑将你的板子分成均匀间隔的网格。每个列的一个方格可以有一条曲线的一个点,并且你会从左到右逐步前进(首先?为了简单起见)。
随机性将通过选择曲线的方格来发挥作用 - 为了防止它变得过于混乱,您可以给这种随机性限制,例如,“除非在此时没有自由的方格可用”,否则“您不能选择违反 abs(当前垂直位置-新垂直位置)<=5 的方格(如果考虑方格之间的距离1),或者其他任意限制。“(”除非在此时没有自由的方格可用“很重要,否则可能会陷入无法解决的状态。)
(抱歉,用鼠标画曲线->最差/没有插值。Catmull-Rom插值可能是你的朋友,尽管我想象中。)
显示应该足够宽松,因为给定网格,你的曲线点不能任意散布在一起,但很可能很难使曲线与终点“流畅”连接 - 如果你不介意任意的终点,这可能是一个好的解决方案,即算法可以自己决定线条的结束位置。
觉得这个想法能帮助你处理曲线吗?

谢谢,方块的想法非常好,但平滑处理等还有很多工作要做。无论如何,感谢您花费时间! - Kirzilla
@Kirzilla:很高兴为您效劳。您能告诉我“但是还有很多关于平滑处理等方面要做”的具体意思吗?也许我可以帮忙解决? - pinkgothic

1
一种方法是首先生成一组随机曲线,然后使用物理求解器在它们之间应用斥力来避免聚集。这里是一个快速的概念证明:

noodle curves

我使用了一种非常专业的工具来创建这个(对于任何有兴趣的人:Kangaroo Physics solver,这是一个为Rhinoceros3d的可视化脚本语言Grasshopper提供插件的工具),但你可能可以在任何主流编程语言中重新创建相同的概念,例如Python。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接