在postscript中,roll
运算符非常通用且难以可视化。你如何确保你朝着正确的方向前进?
我想在roll
上得到一个可靠的句柄,因为我希望能够使用变量转换函数
/f { % x y z
/z exch def
/y exch def
/x exch def
x dup mul
y dup mul
z dup mul add add % x^2+y^2+z^2
} def
使用堆栈操作进入函数,更像是
/f { % x y z
3 1 roll dup mul % y z x^2
3 1 roll dup mul % z x^2 y^2
3 1 roll dup mul % x^2 y^2 z^2
add add % x^2+y^2+z^2
} def
或
/f { % x y z
3 { 3 1 roll dup mul } repeat
2 { add } repeat % x^2+y^2+z^2
} bind def
这些应该通过减少名称查找(哈希表搜索)来更快地执行。
roll
我总是要测试它;而且我通常
第一次尝试就搞错了!我很喜欢exch,不过
答案 0 :(得分:11)
很长一段时间我都遇到滚动困难。我现在记得使用这些方法,它们都是等价的:
n j roll
正面j,滚开
7 8 9 3 1 roll
% 9 7 8
否定,将其取回(或“否定,然后检索”)
% 9 7 8
3 -1 roll
% 7 8 9
或许更好的方式来考虑它是物理堆栈 (对于书籍而言)所以堆栈的顶部字面意思是“在顶部”。
然后正面滚动:
for j number of times pick up n books put the top one on the bottom (shifting the substack "up") put them back down
负面滚动下降:
for j number of times pick up n books put the bottom one on top (shifting the substack "down") put them back down
但我通常会想象堆栈的侧面,对象的方式 将文件视为一系列文字。所以我想到了 积极的滚动作为隐藏在第n个后面的顶级事物 事情;而负面的滚动就像开始时的事情一样 与第n件事。给予和接受。
程。
n j roll
__ j > 0 __ move top j elements to the bottom of n
n TOS
-------------|
| j |
| -----|
| | |
V V |
a b c d e f g h
^ | |
| |-------|
^ |
-<-<-<-<-<-
move
然后回来。
__ j < 0 __ move j elements from the bottom of n to the top
n TOS
-------------|
| j |
|----- |
| | |
V V |
a b c d e f g h
| | ^
|-------| |
| ^
->->->->->-
move
另一种方法是侧面拍摄,并在顶部放置一个粘性轮(可能是一个棉绒辊)
(a) (b) (c) (d) (e) 5 3 roll _______ / \ | 3 | | / | \ | \_______/ (a) (b) (c) (d) (e)
然后正向滚动逆时针方向 就像弧和旋转一样。
_______ (e) / / \ | 3 --| (d) | \ | \_______/ (c) (a) (b) (e)__(d)__(c) /\ | /\ | 3 | | | \_______/ (a) (b) (c)_______ /\ \ (d) |-- 3 | |/ | \_______/ (e) (a) (b) _______ / \ | 3 | | / | \ | \_______/ (c) (d) (e) (a) (b)
负滚动顺时针方向 像arcn和负旋转一样。
_______ / \ | 3 | | / | \ | \_______/ (a) (b) (c) (d) (e) (a)_______ /\ \ (b) |-- 3 | |/ | \_______/ (c) (d) (e) (c)__(b)__(a) /\ | /\ | 3 | | | \_______/ (d) (e) _______ (c) / / \ | 3 --| (b) | \ | \_______/ (a) (d) (e) _______ / \ | 3 | | / | \ | \_______/ (d) (e) (a) (b) (c)
不容易看出负滚动是完全不必要的,因为如果j <0,它可以被n-j代替。例如
3 -1 roll % roll bottom 1 element from 3 to the top
3 2 roll % roll top 2 elements behind the 3rd
是一样的。
16 -4 roll % roll bottom 4 elements from 16 to the top
16 12 roll % roll top 12 elements behind the 16th
是一样的。
这导致最终的,最终的简化视图(尽管上述每个都可以工作)。
你真的只是使用下面的 n-j 元素交换 j 元素。
假设你在堆栈上有这个混乱($ TOS $标记堆栈的顶部),并且想要正确订购它:
g h i j k l m n o p q r s t u v w x y z a b c d e f $TOS$
n 和 j 的向上(向下)。
g h i j k l m n o p q r s t u v w x y z a b c d e f
26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
| | j = 6 . . . .
| n = 26 . . . . . . . . . . . . . . . . . . . . . . .
> 26 6 roll pstack
a b c d e f g h i j k l m n o p q r s t u v w x y z
j 的负值只是将相对于 n 元素中最深元素的分界线定位(从下面开始计算)。
t u v w x y z a b c d e f g h i j k l m n o p q r s
26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
. . . . j = -7 | |
. . . . . . . . . . . . . . . . . . . . . . . n = 26 |
> 26 -7 roll pstack
a b c d e f g h i j k l m n o p q r s t u v w x y z
这是一个便利功能,它提供了一个与大交换视图更接近的滚动界面。
% r0..rN s0..sM N M swap s0..sM r0..rN
% a gentler interface to the power of roll
/swap {
exch 1 index add exch
roll
} def
0 1 2 3 /a /b /c 4 3 swap pstack
输出:
GPL Ghostscript 8.62 (2008-02-29)
Copyright (C) 2008 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
3
2
1
0
/c
/b
/a
GS<7>GS<7>
答案 1 :(得分:1)
简单的说法:如果你做了一些圆形的物体滚动,它与你之间的距离可能会比之前更大,除非你使用的不是你手上的东西(例如:一根魔法棒,......)来使物体滚动
5 1 roll
表示堆栈顶部的1
对象之后距离堆栈顶部的距离更远。
10 11 12 13 14 15 16 17 18 19 20 5 1 roll
与
相同10 11 12 13 14 15 20 16 17 18 19
你看到20越来越深,最后五个元素改变了位置。
5
中的 5 1 roll
表示只有堆栈中的五个第一个对象可能都会改变位置。
-1
和4
具有相同的模5
,因此很容易记住在应用此解决方案之前必须将负数修改为正数。