Graphics post脚本中的旋转图形

Graphics post脚本中的旋转图形,graphics,rotation,postscript,Graphics,Rotation,Postscript,我想知道如何旋转一个图形,比如说在PostScript中旋转一个矩形的某个角度。 或者至少有没有办法画一个非常大胆的!就像,有角度 我有一个围绕一个圆圈的句子列表,所以每个句子都有一个方向,现在,我想把每个句子都放在一个矩形中,并为它们制作超链接。我很久没有使用PostScript了,但我记得你可以使用“旋转” 干杯克里斯我很久没有用PostScript了,但我记得你可以用“旋转” cheers KrisPostscript在给定的上下文中渲染图形-正是这种上下文可以在绘制之前旋转(或缩放/转换

我想知道如何旋转一个图形,比如说在PostScript中旋转一个矩形的某个角度。 或者至少有没有办法画一个非常大胆的!就像,有角度


我有一个围绕一个圆圈的句子列表,所以每个句子都有一个方向,现在,我想把每个句子都放在一个矩形中,并为它们制作超链接。

我很久没有使用PostScript了,但我记得你可以使用“旋转”


干杯克里斯

我很久没有用PostScript了,但我记得你可以用“旋转”


cheers Kris

Postscript在给定的上下文中渲染图形-正是这种上下文可以在绘制之前旋转(或缩放/转换)。因此,图像上的任何元素都可以根据需要进行转换,您所要做的就是事先执行必要的上下文转换

然而,不幸的是,虽然我可以在这篇文章中给你一个关于它的想法,但我是Postscript的一个基本概念,如果你不先理解它,你将无法在其中做任何真正的工作。我建议阅读一篇简短的教程,如中的教程

因此,“rotate”名称是一个函数,它可以旋转graphcis上下文-在绘制任何需要的内容之前使用rotate(在本例中,呈现文本也是“绘制”)


Postscript在给定的上下文中渲染图形-正是这种上下文可以在绘制之前进行旋转(或缩放/转换)。因此,图像上的任何元素都可以根据需要进行转换,您所要做的就是事先执行必要的上下文转换

然而,不幸的是,虽然我可以在这篇文章中给你一个关于它的想法,但我是Postscript的一个基本概念,如果你不先理解它,你将无法在其中做任何真正的工作。我建议阅读一篇简短的教程,如中的教程

因此,“rotate”名称是一个函数,它可以旋转graphcis上下文-在绘制任何需要的内容之前使用rotate(在本例中,呈现文本也是“绘制”)


后记的力量在于它对“延迟装订”理想的无情追求。轮换的实施也不例外。它的工作原理是使用一种更通用的工具,仿射变换矩阵

您可以旋转文本和图形(因为文本图形),因为所有用户指定的坐标首先通过该矩阵相乘以生成设备坐标

要执行所有必要的技巧(缩放、旋转、剪切、平移),我们首先必须将平面z=1上的2d点扩展到3d点(不要问我为什么;更多信息,请阅读Bill Casselman的数学插图或Adobe Blue Book)

由于矩阵的第3列始终为[0 0 1],因此在外部表示中省略了该列,并且该矩阵在postscript中描述为:

[ a b c d e f ]
因此,当您将坐标对用于(例如)一个
moveto
操作符时,
moveto
首先将其转换为设备坐标x'=ax+by+e,y'=cx+dy+f,然后再将
元素添加到当前路径。 更改矩阵:更改用户坐标的“含义”

身份矩阵如下所示:

[ 1 0 0 1 0 0 ]  % x' = x, y' = y
要进行缩放,请将1s替换为x和y缩放因子:

[ Sx 0 0 Sy 0 0 ]  % x' = Sx*x, y' = Sy*y
[ cosW sinW -sinW cosW 0 0 ]  % x' = x*cosW-y*sinW, y' = x*sinW+y*cosW, where W is angle(degrees) from x-axis
要平移,请将e和f替换为x和y平移偏移:

[ 1 0 0 1 Tx Ty ]  % x' = x+Tx, y' = y+Ty
若要旋转,请将a、b、c、d替换为正弦和余弦缩放和剪切因子:

[ Sx 0 0 Sy 0 0 ]  % x' = Sx*x, y' = Sy*y
[ cosW sinW -sinW cosW 0 0 ]  % x' = x*cosW-y*sinW, y' = x*sinW+y*cosW, where W is angle(degrees) from x-axis
您可以使用
concat
来“安装”此矩阵,该矩阵采用当前转换矩阵(CTM),将其乘以新矩阵,并将产品用作新的CTM。因此,
translate
rotate
scale
只是“方便功能”,可以这样实现:

/translate { [ 1 0 0 1 7 -2 roll ] concat } def
/scale { [ 3 1 roll 0 0 3 -1 roll 0 0 ] concat } def
/rotate { [ exch dup cos exch sin dup neg 2 index 0 0 ] concat } def
由于CTM是图形状态的一部分,因此可以使用图形状态堆栈以分层方式操纵变换:

/box { % x y w h   %create a path in the shape of a box w*h with lower left corner at x,y
    4 2 roll moveto
    exch dup 3 1 roll
    0 rlineto
    0 exch rlineto
    neg 0 rlineto
    closepath
} def

/Courier 10 selectfont
100 100 100 100 box stroke   % draw an oriented box
120 120 moveto (inside) show
gsave
    150 150 translate   % make the center of the box the new 0,0 point
    45 rotate   % rotate CCW 45 degrees
    0 0 100 100 box stroke   % a rotated, shifted box
    20 20 moveto (inside) show
grestore
100 200 100 100 box stroke   % another box, just north of the first, in the original coordinte system
120 220 moveto (inside) show
这将生成以下图像:



(来源:)

Postscript的力量在于它对“延迟绑定”理想的无情追求。轮换的实施也不例外。它的工作原理是使用一种更通用的工具,仿射变换矩阵

您可以旋转文本和图形(因为文本图形),因为所有用户指定的坐标首先通过该矩阵相乘以生成设备坐标

要执行所有必要的技巧(缩放、旋转、剪切、平移),我们首先必须将平面z=1上的2d点扩展到3d点(不要问我为什么;更多信息,请阅读Bill Casselman的数学插图或Adobe Blue Book)

由于矩阵的第3列始终为[0 0 1],因此在外部表示中省略了该列,并且该矩阵在postscript中描述为:

[ a b c d e f ]
因此,当您将坐标对用于(例如)一个
moveto
操作符时,
moveto
首先将其转换为设备坐标x'=ax+by+e,y'=cx+dy+f,然后再将
元素添加到当前路径。 更改矩阵:更改用户坐标的“含义”

身份矩阵如下所示:

[ 1 0 0 1 0 0 ]  % x' = x, y' = y
要进行缩放,请将1s替换为x和y缩放因子:

[ Sx 0 0 Sy 0 0 ]  % x' = Sx*x, y' = Sy*y
[ cosW sinW -sinW cosW 0 0 ]  % x' = x*cosW-y*sinW, y' = x*sinW+y*cosW, where W is angle(degrees) from x-axis
要平移,请将e和f替换为x和y平移偏移:

[ 1 0 0 1 Tx Ty ]  % x' = x+Tx, y' = y+Ty
若要旋转,请将a、b、c、d替换为正弦和余弦缩放和剪切因子:

[ Sx 0 0 Sy 0 0 ]  % x' = Sx*x, y' = Sy*y
[ cosW sinW -sinW cosW 0 0 ]  % x' = x*cosW-y*sinW, y' = x*sinW+y*cosW, where W is angle(degrees) from x-axis
您可以使用
concat
来“安装”此矩阵,该矩阵采用当前转换矩阵(CTM),将其乘以新矩阵,并将产品用作新的CTM。因此,
translate
rotate
scale
只是“方便功能”,可以这样实现:

/translate { [ 1 0 0 1 7 -2 roll ] concat } def
/scale { [ 3 1 roll 0 0 3 -1 roll 0 0 ] concat } def
/rotate { [ exch dup cos exch sin dup neg 2 index 0 0 ] concat } def
由于CTM是图形状态的一部分,因此可以使用图形状态堆栈以分层方式操纵变换:

/box { % x y w h   %create a path in the shape of a box w*h with lower left corner at x,y
    4 2 roll moveto
    exch dup 3 1 roll
    0 rlineto
    0 exch rlineto
    neg 0 rlineto
    closepath
} def

/Courier 10 selectfont
100 100 100 100 box stroke   % draw an oriented box
120 120 moveto (inside) show
gsave
    150 150 translate   % make the center of the box the new 0,0 point
    45 rotate   % rotate CCW 45 degrees
    0 0 100 100 box stroke   % a rotated, shifted box
    20 20 moveto (inside) show
grestore
100 200 100 100 box stroke   % another box, just north of the first, in the original coordinte system
120 220 moveto (inside) show
这将生成以下图像:



(来源:)

它不是只用于文本吗?不是数字?不是只有文字吗?不是为了数字吗?谢谢链接和y