后脚本中的旋转图形

时间:2011-06-18 14:13:32

标签: graphics rotation postscript

我想知道如何旋转图形,在后期脚本中以某个角度说明矩形。 或者至少有没有办法画出非常大胆的!喜欢,有角度!?

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

3 个答案:

答案 0 :(得分:3)

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

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

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

[ x     [ a b 0 
  y   *   c d 0    =  [ x' y' 1 ] = [ ax+cy+e bx+dy+f 1 ]
  1 ]     e f 1 ]

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

[ a b c d e f ]

因此,当您使用坐标对,例如moveto运算符时,moveto首先将其转换为设备坐标,x'= ax + by + e,y'= cx + dy + f,在将<</move [x' y']>>元素添加到当前路径之前。 更改矩阵:更改用户坐标的“含义”。

单位矩阵是:

[ 1 0 0 1 0 0 ]  % x' = x, y' = y

要缩放,请用x和y缩放因子替换1:

[ Sx 0 0 Sy 0 0 ]  % x' = Sx*x, y' = Sy*y

要翻译,请将e和f替换为x和y平移偏移:

[ 1 0 0 1 Tx Ty ]  % x' = x+Tx, y' = y+Ty

要旋转,用sin和cos缩放和剪切因子替换a,b,c,d:

[ 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。因此translaterotatescale只是“便利功能”,可以这样实现:

/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

这会产生以下图像:

Rotating boxes and text http://xpost.googlecode.com/files/rotbox.png

答案 1 :(得分:0)

我很长时间没有使用PostScript,但我记得你可以使用“旋转”。

                             % do some steps
                             % ...
                             % ...
 20 20 moveto                % go to new position
 30 /Times-Roman SetFont     % select active font
 45 rotate                   % set direction to diagonal
 (Something)show             % print text "Something"
 showpage                    % show it all
欢呼克里斯

答案 2 :(得分:0)

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

然而,不幸的是,虽然我可以在写作中给你一个关于它的想法,但我是Postscript的一个基本概念,如果不首先理解它,你将无法做任何真正的工作。我建议您阅读一个简短的教程,例如http://paulbourke.net/dataformats/postscript/中的教程。

因此,“旋转”名称是一个旋转graphcis上下文的函数 - 在绘制任何你想要的东西之前使用旋转(在这种情况下渲染文本也是“绘图”)。

%!PS

(Helvetica) findfont 12 scalefont setfont   %select a font to use

300 300 translate    % sets the orign at 300,300 points from the bottom left of page

/start 5  def        % creates variable for keeping track of horizontal position of text

36                   % pushes number of repeats on the stack
{
    start 5 moveto   % places cursor on the starting position
    (postscript) show % renders the string in the starting position, within the current context

    /start  start 3 add def   % increases the value on the variable
   10 rotate         % rotates the context 10 degrees clockwise   (around the 300,300 new origin)
}  repeat           

showpage             % renders whole page