2011-07-12 63 views

回答

5

我敢打赌,你可以写出一个算法,基本上需要x随机曲折的数量,直到出口坐标。这也假定算法足够聪明以检查转弯的角度。 (假设你不想在结网中结束)

但是,假设这不是你的毕业任务,或者你在每小时基础上支付这个工作,这将是一个浪费时间和成功是非常值得怀疑的。

即使你设法生成单行算法,这样做,以便线条不会彼此靠得太近,这几乎是不可能的。你最终会像这样的东西:knot-web

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

4

这是远从一个完整的答案,但在我的脑海里似乎是它可以帮助你:

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

随机性会通过为曲线选择一个平方来发挥作用 - 为了防止它变得过于混乱,可以给这个随机性界限,比如说,“你不能选择一个正方形(如果距离从广场到广场被认为是1)违反abs(current vertical position - new vertical position) <= 5,除非在这一点上没有这样的空间“或者其他任意限制。 (“除非没有这样是免费的了,在这一点上”是很重要的,否则有可能给自己锁定在一个无法解决的状态。)

Two example curves generated this way.

(对不起,绘制曲线与我的鼠标 - >最坏/无插值永远。卡特莫尔-ROM插入可能会成为你的朋友在这里,不过,我想。)

显示应该足够宽松给你的曲线点不能随意飞散一起给出一个网格,但它可能是非常困难的如果你不介意任意的结束点,那么得到曲线连接到流畅的终点 - 可能是一个很好的解决方案不过,算法可以自行决定它想要结束的地方。

想想这个想法可能会帮助你的曲线吗?

+0

谢谢,非常漂亮的主意与广场,但有很多与平滑等。无论如何,谢谢你的时间! – Kirzilla

+0

@Kirzilla:很高兴。你能告诉我你的意思是什么吗?但平滑等方面还有很多事情要做,也许我可以帮忙吗? – pinkgothic