【问题标题】:L-System tree won't branch correctlyL-System 树不会正确分支
【发布时间】:2020-05-15 18:58:19
【问题描述】:

我曾尝试使用 SFML 在 c++ 中实现 L-System,但由于某种原因它不能按预期工作。

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

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

在我的程序中,而不是像预期的那样在两个分支中分支,这些分支分别仅分支一个分支(右一个)分支。 但是,为什么他的代码会产生完全不同的结果,而这在这个规则集中是不可能的呢?

【问题讨论】:

  • 不要链接到代码。请以minimal reproducible example 形式发布所有相关代码in 问题。
  • [ 是压入,就像压入堆栈,而不仅仅是保存唯一的位置] 是流行音乐。你知道堆栈是如何工作的吗?

标签: c++ turtle-graphics fractals


【解决方案1】:

您使用以下字母实现了一个 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]]
                                         [...............................................................] [...............................................................]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2022-11-23
    • 2018-07-16
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多