L 系统树不会正确分支

L-System tree won't branch correctly

我曾尝试使用 SFML 在 C++ 中实现 L 系统,但由于某些原因它没有按预期工作。

我尝试复制这个程序: https://www.youtube.com/watch?v=E1B4UoSQMFw?t=1256 除了分支之外,一切正常。在时间戳 (20:56) 处,您可以看到树分支成两个分支,并且这两个分支分别分支。

然而,根据规则,这不应该是可能的(乌龟可以保存 position/rotation 来创建一个新分支,但它一次只能保存一个位置,所以在一个分支内分支多个次是不可能的)

在我的程序中,而不是在两个分支中分支,这两个分支单独分支,只有进一步的一个分支(右边的一个)分支,正如预期的那样。 但是,为什么他的代码会产生完全不同的结果,而使用此规则集是不可能的?

您使用以下字母实施了 L 系统:

字母表:F+-[]

以及以下规则:

规则 1:FFF+[+F-F-F]-[-F+F+F]

字母字符的含义很turtle-graphic,如下:

  • F前进1个单位,边走边划线
  • +顺时针旋转
  • -逆时针旋转
  • [ 将当前状态压入堆栈。
  • ] 从堆栈中弹出状态并使其成为当前状态。

这需要您知道 stack 是什么。

大家可以看到,因为规则中的方括号里面有一个F,所以二代怎么会有嵌套的方括号。

(很抱歉下面的长行,但这是一个很长的规则,打破这一行会造成混淆。只需向右滚动即可。观察我如何突出显示匹配嵌套括号的外部组。)

FF+[+F-F-F]-[-F+F+F]FF+[+F-F-F]-[-F+F+F]+[+FF+[+F-F-F]-[-F+F+F]-FF+[+F-F-F]-[-F+F+F]-FF+[+F-F-F]-[-F+F+F]]-[-FF+[+F-F-F]-[-F+F+F]+FF+[+F-F-F]-[-F+F+F]+FF+[+F-F-F]-[-F+F+F]]
                                         [...............................................................] [...............................................................]

当应用海龟图形解释时,当我们在遇到 ] 之前遇到第二个 [ 时,我们现在将在堆栈中保存多个状态。可以保存任意数量的状态。堆栈是 "first in, last out",就像堆叠盘子一样,您只能访问堆栈顶部的盘子。每次你 push state with [ 就像在盘子堆中添加一个盘子。当您看到 ] 时,您会从堆栈中移除顶板。这样从栈顶取出一个盘子就是pop它。在这种情况下,每个盘子代表乌龟被推时的状态。弹出状态会将乌龟的位置和方向恢复到保存的位置。