我试图生成一个后记"位图"通过重复调用块绘制过程。
我不想在每个调用中定义块的位置,而是根据已知的块大小(例如)100像素自动更新起始位置,如下所示:
% starting position
/px { 72 } def
/py { 720 } def
% block-drawing procedure, input= r-g-b
/block {
setrgbcolor
px py moveto
0 100 rlineto
100 0 rlineto
0 100 neg rlineto
fill
% NOW ADJUST PX AND PY BY 100 AND -100, AHEAD OF NEXT CALL
} def
% draw three increasingly lighter boxes, automatically shifted
0 0 0 box
.25 .25 .25 box
.5 .5 .5 box
% etc...
有没有一种简单的方法可以达到这个目的?
答案 0 :(得分:2)
是的,改变px和py的值。
请注意,您的代码将px和py定义为可执行数组,执行时会在操作数堆栈上保留一个值。没有必要这样做,这个:
/px 72 def
/py 720 def
同样适用。
我认为你错过了' def
'关联当前字典中的键和值。由于您尚未启动新字典,因此您将获得默认字典userdict
。如果您使用' def
'再次,然后它将新值与字典中的相同键相关联。
所以,如果你这样做:
% starting position
/px 72 def
/py 720 def
% block-drawing procedure, input= r-g-b
/block {
setrgbcolor
px py moveto
0 100 rlineto
100 0 rlineto
0 100 neg rlineto
fill
% NOW ADJUST PX AND PY BY 100 AND -100, AHEAD OF NEXT CALL
px 100 add /px exch def
py 100 sub /py exch def
} def
% draw three increasingly lighter boxes, automatically shifted
0 0 0 box
.25 .25 .25 box
.5 .5 .5 box
% etc...
这将做你想要的。
答案 1 :(得分:1)
Ken已经回答了关于制作和使用定义的问题,但我想展示一种不同的方法,这可能是后记更自然的。
如果您想拥有自动定位的绘图程序,您可以将每个程序视为字体中的字形。我的意思是你使用图形状态中的currentpoint
作为变量。它很好地保持了两个坐标。然后,每个绘图过程执行rmoveto
以定位下一个过程的点。
所以这就是我将如何编写块绘制过程:
72 720 % starting position
% r g b block - [expects currentpoint and adjusts currentpoint]
% draws a block
/block {
setrgbcolor
0 100 rlineto
100 0 rlineto
0 100 neg rlineto
closepath
currentpoint fill moveto
% NOW ADJUST PX AND PY BY 100 AND -100, AHEAD OF NEXT CALL
100 -100 rmoveto
} def
% draw three increasingly lighter boxes, automatically shifted
moveto % starting position from above
0 0 0 block
.25 .25 .25 block
.5 .5 .5 block
由于fill
会破坏路径,因此我们必须使用currentpoint
... moveto
将其夹在中间以保留该点。
另外,看看我们如何在不创建新定义的情况下为一个的长度梳理一个新参数。我们的想法是,我们可以在堆栈上安排数据,然后调用所有运算符。因此,如果参数为100
,我们只需要使堆栈看起来像0 -100 100 0 0 100
,然后调用rlineto rlineto rlineto
甚至3{rlineto}repeat
。请记住,所有数据都会进入堆栈,然后可以自上而下。
因此,反向建立数据 ,然后直接执行运算符。
0 -100
100 0
0 100
rlineto
rlineto
rlineto
构建数据只是简单的堆栈操作和算术。
72 720 % starting position
% N r g b block - [expects currentpoint and adjusts currentpoint]
% draws a block colored (r,g,b) of side-length N
/block {
setrgbcolor % N
0 exch dup neg exch 0 0 2 index % 0 -N N 0 0 N
3 {rlineto} repeat
closepath
currentpoint fill moveto
% NOW ADJUST PX AND PY BY 100 AND -100, AHEAD OF NEXT CALL
100 -100 rmoveto
} def
% draw three increasingly lighter boxes, automatically shifted
moveto % starting position from above
0 0 0 block
.25 .25 .25 block
.5 .5 .5 block