我想知道如何旋转图形,在后期脚本中以某个角度说明矩形。 或者至少有没有办法画出非常大胆的!喜欢,有角度!?
我有一个圆圈的句子列表,所以每个或一个方向,现在,我想把每个放在一个矩形,并为它们制作超链接。
答案 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。因此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
这会产生以下图像:
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