是否可以生成这种随机曲线?
我试过 IMagick 贝塞尔曲线(见http://www.php.net/manual/en/function.imagickdraw-bezier.php),但即使有 20-30 点,它们看起来也不像这样。这是我的示例http://mechanicalzilla.com/sandbox/imagick/curve.php
谢谢你。
是否可以生成这种随机曲线?
我试过 IMagick 贝塞尔曲线(见http://www.php.net/manual/en/function.imagickdraw-bezier.php),但即使有 20-30 点,它们看起来也不像这样。这是我的示例http://mechanicalzilla.com/sandbox/imagick/curve.php
谢谢你。
我敢打赌,您可以编写一个算法,该算法基本上会x
在直接到达出口坐标之前进行多次随机扭曲。这也假设算法足够聪明,可以检查转弯的角度。(假设你不想在结网中结束)
但是,假设这不是您的毕业任务,或者您按小时计酬来完成这项工作,那么这将是浪费时间,而且成功是非常值得怀疑的。
即使您设法生成单线算法,这样做也几乎是不可能的。你最终会得到这样的东西:
好像:
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;
}
这远不是一个完整的答案,但在我看来,它似乎可以帮助你:
不要从整条线的起点到终点绘制曲线,而是考虑将您的电路板细分为均匀间隔的网格。网格一列的每个正方形都有权在其中包含一条曲线的一个点,并且您会从左到右稳步前进(起初?为了简单起见。)。
随机性将通过为曲线选择一个正方形来发挥作用 - 为了防止它变得过于混乱,你可以给这个随机性界限,比如说,“你不能选择一个正方形(如果从一个正方形到一个正方形的距离被认为是1
) 违反abs(current vertical position - new vertical position) <= 5
,除非此时没有这样的自由”或其他任意限制。(“除非此时不再免费”很重要,否则可能会将自己锁定在无法解决的状态。)
(抱歉,用我的鼠标绘制曲线 -> 最差/没有插值。不过,我想,Catmull-Rom 插值可能是你的朋友。)
鉴于您的曲线点不能在给定网格的情况下任意分散在一起,因此显示应该足够松散,但可能很难让曲线“流畅地”连接到端点 - 如果您不介意任意的话,这可能是一个很好的解决方案端点,但是,读作,算法可以自己决定它希望线在哪里结束。
认为这个想法可能对你的曲线有所帮助?
解决此问题的一种方法是首先生成一组随机曲线,然后使用物理求解器在它们之间施加排斥力以避免结块。
这是概念的快速证明:
我使用一个非常小众的工具(对于任何感兴趣的人:袋鼠物理求解器,Grasshopper 的插件,Rhinoceros3d 的可视化脚本语言)创建了这个,但您可能可以在任何主流编程语言中重新创建相同的概念,例如。Python。