如何在脚本中对对象进行分组?

问题描述 投票:0回答:1

我用附言拍了张照片,它是6个正方形的集合。我想将此输出分组为一个对象。是的,我知道我可以为将创建此图像的函数创建一个定义。我的问题是我想将此图像作为一个组旋转,而不是修改每个坐标。每一个创造它的广场。我不确定后记是否具有此功能。可伸缩矢量图形将其作为<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

squares

我尝试在循环外和closepath功能内设置Sq,这些正方形是成组的线。也许我不应该关闭那条路?我真的不知道

postscript
1个回答
0
投票

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来设置当前点。

© www.soinside.com 2019 - 2024. All rights reserved.