Graphics post脚本中的旋转图形
我想知道如何旋转一个图形,比如说在PostScript中旋转一个矩形的某个角度。 或者至少有没有办法画一个非常大胆的!就像,有角度Graphics post脚本中的旋转图形,graphics,rotation,postscript,Graphics,Rotation,Postscript,我想知道如何旋转一个图形,比如说在PostScript中旋转一个矩形的某个角度。 或者至少有没有办法画一个非常大胆的!就像,有角度 我有一个围绕一个圆圈的句子列表,所以每个句子都有一个方向,现在,我想把每个句子都放在一个矩形中,并为它们制作超链接。我很久没有使用PostScript了,但我记得你可以使用“旋转” 干杯克里斯我很久没有用PostScript了,但我记得你可以用“旋转” cheers KrisPostscript在给定的上下文中渲染图形-正是这种上下文可以在绘制之前旋转(或缩放/转换
我有一个围绕一个圆圈的句子列表,所以每个句子都有一个方向,现在,我想把每个句子都放在一个矩形中,并为它们制作超链接。我很久没有使用PostScript了,但我记得你可以使用“旋转”
干杯克里斯我很久没有用PostScript了,但我记得你可以用“旋转”
cheers KrisPostscript在给定的上下文中渲染图形-正是这种上下文可以在绘制之前旋转(或缩放/转换)。因此,图像上的任何元素都可以根据需要进行转换,您所要做的就是事先执行必要的上下文转换 然而,不幸的是,虽然我可以在这篇文章中给你一个关于它的想法,但我是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