你如何保持`roll`操作符直线?

时间:2013-04-14 09:23:12

标签: postscript

在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,不过

2 个答案:

答案 0 :(得分:11)

很长一段时间我都遇到滚动困难。我现在记得使用这些方法,它们都是等价的:

押韵(-ish)

  

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

是一样的。


这导致最终的,最终的简化视图(尽管上述每个都可以工作)。

Roll只是一个很大的交换

你真的只是使用下面的 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表示只有堆栈中的五个第一个对象可能都会改变位置。

-14具有相同的模5,因此很容易记住在应用此解决方案之前必须将负数修改为正数。