首页 > 解决方案 > Postscript中通过递归的分形Pifagor树

问题描述

我正在尝试通过递归在 PostScript 中实现绘制 Pifagor 的树,但是出了点问题 - 我的每个三角形的右导管没有绘制,所以我的右侧部分是空的。我究竟做错了什么?这是代码:

newpath
300 300 moveto
size 0 rlineto
/tree{
    1 sub /n exch def
    n 0 le { 1} 
        {
            /size exch def          %takes size from past stroke(for this case it is number 90 in row №18)


            0 size rlineto
            size -1 mul 0 rlineto
            0 size -1 mul rlineto
            0 size rlineto


            45 rotate
            /size size 2 sqrt mul 0.5 mul def
            size 0 rlineto
            size n tree


            270 rotate
            size 0 rlineto
            size n tree


    }ifelse


} def
90 31 tree      %size of square's side, number of iterations
stroke showpage

标签: recursionpostscriptfractals

解决方案


好吧,您的程序在第 3 行定义它之前使用了“大小”,因此它会在绘制任何内容之前立即抛出一个“未定义”错误。我通过将其更改为 90 来解决此问题:

newpath
300 300 moveto
size 0 rlineto

您的程序首先绘制树的左侧,通过“树”递归。然后它后退一个级别并在每个级别绘制匹配的右侧,再次根据需要递归。

但是在我们下降到最小的物体之后,尺寸被定义为一个很小的数字,所以画了另一边,小到你看不到它。

您似乎试图将 PostScript 字典条目视为 C 函数中的局部变量,但 PostScript 不能那样工作。没有变量,只有字典及其内容。

您的代码在当前字典中定义 /n 和 /size。然后它再次调用'tree',重新定义当前字典中的/n和/size等等。

您可能希望将它们留在堆栈中,而不是在当前字典中定义 n 和 size。这确实意味着,如果递归足够深,您将收到 stackoverflow 错误,但最终使用任何语言都会遇到这种情况。

请注意,您当前的程序不会保持堆栈不变,如果 n 小于或等于零,您不会从堆栈中弹出“大小”,而是将“1”压入堆栈。所以你也必须解决这个问题。


推荐阅读