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 没有任何“组”的概念,因此您不能对对象进行分组。您可以将它们放在一个表格中,但这很少见,而且无论如何都不能真正做到您想要的。
正如您所指出的,显而易见的解决方案是简单地定义一个执行绘图的函数。那是一个“组”,或者与您将在 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 来设置当前点。
推荐阅读
- visual-c++ - 将图像直接保存到 _variant_t
- c# - 事务回滚后正在更新 EF6 数据
- html - 在 Markdown 中更改颜色标签
- c++ - 为什么不调用重载函数?
- docker - 如何让 docker-compose 在 up --rm 或 build --no-cache 使用后在 down 期间不删除容器
- c# - C# 如何在 WinForms 中使用计时器?
- javascript - 用html标签替换字符串周围的markdown标签
- javascript - 具有滚动内容 % 或 vh 的全高背景图像
- docker - 下载 .tgz 文件并将其解压缩到 Dockerfile 中的不同路径
- matlab - 有没有更好的方法来编写我的下采样函数?