如何在后记中对对象进行分组?

How can objects be grouped in postscript?

我在后记做了一张图,是6个方格的合集。 我想将此输出分组为一个对象。是的,我知道我可以创建一个函数的定义来输出这张图片。我的问题是我想将此图像作为一个组旋转,而不是修改每个坐标。创建它的每个方块。我不确定 postscript 是否具有此功能。 Scalable Vector Graphics 有它,作为 <g> 标签。抱歉,如果这不完全相关,但它是我想要做的将正方形分组在一起的功能。

生成这张图片的代码是:

%!PS
%I made PS extensions executable via evince on my system
/Sq {0 0 moveto 0 100 lineto 100 100 lineto 100 0 lineto closepath} def
gsave

150 150 translate

6{
Sq 87 -50.1 translate
60 rotate
}repeat

0 0 0 setrgbcolor
closepath
1 setlinewidth
stroke

我尝试在循环外设置 closepath,在 Sq 函数内,方块是分组线。也许我不应该关闭那条路?我真的不知道。

PostScript 没有任何 'group' 的概念,因此您无法对对象进行分组。你可以把它们放在一个表格中,但这种情况很少见,而且无论如何都不会真正按照你的意愿去做。

如您所述,显而易见的解决方案是简单地定义一个函数来进行绘图。那是 'group',或者与您将要在 PostScript 中获得的一样接近。

那么你只需在调用函数之前修改CTM。目前还不清楚您希望如何应用轮换,但这里有一个例子:

%!PS
%I made PS extensions executable via evince on my system
/Sq {0 0 moveto 0 100 lineto 100 100 lineto 100 0 lineto closepath} def

/Polygon {
  6{
    Sq 87 -50.1 translate
    60 rotate
  }repeat

  0 0 0 setrgbcolor
  1 setlinewidth
  stroke
} bind def

gsave
150 150 translate
Polygon
grestore

gsave
250 250 translate
45 rotate
Polygon
grestore

showpage

请注意,旋转将围绕当前点旋转 CTM。在这种情况下,这意味着您的多边形围绕第一个顶点旋转,如果您想围绕中心旋转,则需要计算多边形中心的坐标,移动到该点,执行旋转,然后计算在开始绘制多边形之前初始顶点的坐标(记住 CTM 现在已旋转!)。

你原来的程序有一些小问题;你在没有匹配的 grestore 的情况下执行 gsave,所以 gsave 没有效果,你在 gstate 堆栈上留下了一个保存状态。您不需要第二个 'closepath' 因为所有子路径都已关闭(在这种情况下不会造成任何问题)。您的程序也不执行 'showpage',因此从技术上讲,符合规范的 PostScript 解释器不会绘制任何内容。 NeWS 克隆使用 Display PostScript,在执行时绘制图形基元。

如果您使用 rmoveto 和 rlineto 而不是 lineto 和 moveto,您可以重写代码,这样您就不需要 'translate' CTM 并且可以简单地使用 moveto 来设置当前点。