Postscript 中的分形 Pifagor 树通过递归
A fractal Pifagor's tree in Postscript via recursion
我正在尝试通过递归在 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
好吧,您的程序在第 3 行定义它之前使用了 'size',因此它会在绘制任何内容之前立即抛出 'undefined' 错误。我通过将其更改为 90 来解决此问题:
newpath
300 300 moveto
size 0 rlineto
您的程序首先绘制树的左侧,递归 'tree'。然后它退回一个级别并在每个级别绘制匹配的右侧,再次根据需要递归。
但是我们下降到最小的物体后,尺寸被定义为一个很小的数字,所以画了另一边,小到你看不到。
您似乎试图将 PostScript 字典条目视为 C 函数中的局部变量,但 PostScript 不是这样工作的。没有变量,只有字典和它们的内容。
您的代码在当前字典中定义了 /n 和 /size。然后它再次调用'tree',重新定义当前字典中的/n和/size等等。
您可能不想在当前字典中定义 n 和 size,而是希望将它们留在堆栈中。这确实意味着如果递归足够深你会得到一个 Whosebug 错误,但这是你最终会得到任何语言的错误。
请注意,您当前的程序不会保持堆栈不变,如果 n 小于或等于零,您不会从堆栈中弹出 'size' 并将“1”压入堆栈.所以你也必须解决这个问题。
作为 Ken 回答的补充,您可以通过在函数启动时安装新字典并在函数结束时删除它来模拟局部变量。
/tree {
1 dict begin
%...
end
} def
如果回避太深,您将收到 dictWhosebug
错误。
我正在尝试通过递归在 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
好吧,您的程序在第 3 行定义它之前使用了 'size',因此它会在绘制任何内容之前立即抛出 'undefined' 错误。我通过将其更改为 90 来解决此问题:
newpath
300 300 moveto
size 0 rlineto
您的程序首先绘制树的左侧,递归 'tree'。然后它退回一个级别并在每个级别绘制匹配的右侧,再次根据需要递归。
但是我们下降到最小的物体后,尺寸被定义为一个很小的数字,所以画了另一边,小到你看不到。
您似乎试图将 PostScript 字典条目视为 C 函数中的局部变量,但 PostScript 不是这样工作的。没有变量,只有字典和它们的内容。
您的代码在当前字典中定义了 /n 和 /size。然后它再次调用'tree',重新定义当前字典中的/n和/size等等。
您可能不想在当前字典中定义 n 和 size,而是希望将它们留在堆栈中。这确实意味着如果递归足够深你会得到一个 Whosebug 错误,但这是你最终会得到任何语言的错误。
请注意,您当前的程序不会保持堆栈不变,如果 n 小于或等于零,您不会从堆栈中弹出 'size' 并将“1”压入堆栈.所以你也必须解决这个问题。
作为 Ken 回答的补充,您可以通过在函数启动时安装新字典并在函数结束时删除它来模拟局部变量。
/tree {
1 dict begin
%...
end
} def
如果回避太深,您将收到 dictWhosebug
错误。