我试图用SFML在c ++中实现L系统,但是由于某些原因,它无法按预期工作。
我尝试复制此程序:https://www.youtube.com/watch?v=E1B4UoSQMFw?t=1256除分支外,一切都正常。在时间戳记(20:56),您可以看到树分支成两个分支,并且这两个分支分别分支。
但是,由于规则的原因,这是不可能的(乌龟可以保存位置/旋转来建立新的分支,但是一次只能保存一个位置,因此不可能在一个分支内多次分支)
在我的程序中,而不是在两个分别分支的分支中分支,正如预期的那样,仅进一步分支中的一个分支(右一个)。但是,为什么他的代码却产生了完全不同的结果,而这个规则集不可能做到这一点?
您使用以下字母实现了L系统:
字母:F+-[]
以及以下规则:
规则1:F
→FF+[+F-F-F]-[-F+F+F]
字母字符的含义非常像乌龟图形,如下所示:
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]]
[...............................................................] [...............................................................]
当应用海龟图形解释时,当我们在遇到[
之前遇到第二个]
时,现在将在堆栈上保存多个状态。可以保存任意数量的状态。堆叠是“先进先出”,就像堆叠板一样,您只能访问堆叠顶部的板。每次您用[
推入状态时,就像将一个印版添加到印版堆栈中。当您看到]
时,请从纸叠中取出顶板。在这种情况下,每个板块都代表乌龟被推入时的状态。弹出状态会将乌龟的位置和方向恢复到保存的位置。