绘制(描述)多边形

此示例尝试模仿内置路径构造运算符(如 arc)的行为。

如果存在当前点,则 poly 首先绘制一条线到(x, y)+(r, 0),否则它将通过移动到该点开始。

而不是 gsavegrestore(它具有丢弃我们想要的当前路径的非常改变的不良效果),它保存了当函数开始时存在的当前变换矩阵(CTM)的副本。

然后它对每个后续点进行切换,通过缩放和旋转矩阵始终为(0,1)。最后,它调用 closepath 然后将保存的矩阵恢复为 CTM。

% x y n radius  poly  -
% construct a path of a closed n-polygon
/poly {
    matrix currentmatrix 5 1 roll  % matrix x y n radius
    4 2 roll translate             % matrix n radius
    dup scale                      % matrix n
    360 1 index div exch           % matrix 360/n n
    0 1 {lineto currentpoint moveto}stopped{moveto}if   % start or re-start subpath
    {                              % matrix 360/n
        dup rotate                 % matrix 360/n
        0 1 lineto                 % matrix 360/n
    } repeat                 % matrix 360/n
    pop                      % matrix
    closepath                % matrix
    setmatrix                %
} def