绘制(描述)多边形
此示例尝试模仿内置路径构造运算符(如 arc
)的行为。
如果存在当前点,则 poly
首先绘制一条线到(x, y)+(r, 0),否则它将通过移动到该点开始。
而不是 gsave
… grestore
(它具有丢弃我们想要的当前路径的非常改变的不良效果),它保存了当函数开始时存在的当前变换矩阵(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