首页 > 解决方案 > 后记中如何对对象进行分组?

问题描述

我在后记中做了一张图片,它是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

解决方案


PostScript 没有任何“组”的概念,因此您不能对对象进行分组。您可以将它们放在一个表格中,但这很少见,而且无论如何都不能真正做到您想要的。

正如您所指出的,显而易见的解决方案是简单地定义一个执行绘图的函数。那是一个“组”,或者与您将在 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”,因为所有子路径都已关闭(在这种情况下也不会导致任何问题)。您的程序也不执行“显示页面”,因此从技术上讲,符合标准的 PostScript 解释器不会绘制任何内容。使用 Display PostScript 的 NeWS 克隆在执行时会绘制图形基元。

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


推荐阅读