L 系统树无法正确分支

L-System tree won't branch correctly

本文关键字:分支 系统      更新时间:2023-10-16

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

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

但是,由于规则,这应该是不可能的(可以保存位置/旋转以创建新分支,但它一次只能保存一个位置,因此无法在分支内多次分支(

在我的程序中,而不是像预期的那样在两个分支中分支,这些分支单独分支只有一个分支(右一个(分支。 但是为什么他的代码会产生完全不同的结果,而这个规则集不应该这样做呢?

您实现了具有以下字母表的 L 系统:

字母:F+-[]

以及以下规则:

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

字母字符的含义非常像图形,如下所示:

  • F向前移动 1 个单元并边走边画一条线。
  • +顺时针转动
  • -逆时针旋转
  • [将当前状态推送到堆栈上。
  • ]从堆栈中弹出状态并使其成为当前状态。

这要求您知道什么是堆栈。

您可以看到,由于规则的方括号内有一个 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]]
[...............................................................] [...............................................................]

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