阅读Adobe PDF 1.7(ISO 32000-1:2008)规范后,我仍然无法理解如何正确创建转换矩阵.
4.2/4.3节中的规范说明如下:
•翻译指定为[1 0 0 1 tx ty],其中tx和ty分别是在水平和垂直维度上平移坐标系原点的距离.
•通过[sx 0 0 sy 0 0]获得缩放.这缩放坐标,使得新坐标系的水平和垂直维度中的1个单位分别与先前坐标系中的sx和sy单位的大小相同.
•旋转由[cosθsinθ-sinθcosθ00]产生,其具有使坐标系轴逆时针旋转角度θ的效果.
•斜率由[1tanαtanβ10 0]指定,它将x轴倾斜角度α,将y轴倾斜角度β.
鉴于此,一个人如何按顺序使用转换?
我可以成功地使用Translation和Rotation一起,但当我尝试也使用Scaling或Skewing事情严重错误.也许我错误地使用了CTM,甚至我的数学都没有.我试图在坐标位置(50,50)创建文本,旋转45度,缩放2(按此顺序).我之所以说" 按此顺序 "是因为规范声明转换的顺序有所不同(规范给出了基于转换排序的差异的图形示例).那么流对象会是什么样子和/或矩阵数学如何适用于此?
工作((50,50)+ 45度旋转的转换)
[ 1 0 0 ] [ 0.707 0.707 0 ] [ 0.707 0.707 0 ]
[ 0 1 0 ] x [ -0.707 0.707 0 ] = [ -0.707 0.707 0 ]
[ 50 50 1 ] [ 0 0 1 ] [ 50.000 50.000 1 ]
BT
0.707 0.707 -0.707 0.707 50 50 Tm
/F1 36 Tf
(Hello, World!) Tj
ET
Run Code Online (Sandbox Code Playgroud)
当我尝试使用矩阵乘法来添加缩放时,它似乎不起作用:
[ 0.707 0.707 0 ] [ 2 0 0 ] [ 1.414 1.414 0 ]
[ -0.707 0.707 0 ] x [ 0 2 0 ] = [ -1.414 1.414 0 ]
[ 50.000 50.000 1 ] [ 0 0 1 ] [ 100.000 100.000 1 ]
Run Code Online (Sandbox Code Playgroud)
数学似乎是正确的,除了现在文本从坐标(100,100)开始而不是(50,50).这对我来说似乎不正确,因为我试图从(50,50)开始,旋转45度,然后将其缩放2.
数学似乎是正确的,除了现在文本从坐标(100,100)开始而不是(50,50).这对我来说似乎不正确,因为我试图从(50,50)开始,旋转45度,然后将其缩放2.
但这确实有道理.如果你首先翻译(50,50),然后按2缩放,你实际上翻译了(50,50)两次,即(100,100).
你似乎需要的是首先按两个比例缩放(使其大小为两倍,但尚未移动或旋转),然后仅旋转和平移(不会影响转换的缩放),即
[ 2 0 0 ] [ 0.707 0.707 0 ] [ 1.414 1.414 0 ]
[ 0 2 0 ] x [ -0.707 0.707 0 ] = [ -1.414 1.414 0 ]
[ 0 0 1 ] [ 50.000 50.000 1 ] [ 50.000 50.000 1 ]
Run Code Online (Sandbox Code Playgroud)
一些挥手:你说的时候想到的是什么
我试图在坐标位置(50,50)创建文本,旋转45度,缩放2(按此顺序).
肯定是在翻译成(50,50)之后,以下操作应该使点(50,50)固定.但这不是其他操作所做的,它们保持原点(0,0)固定.因此,您应首先在原点缩放和旋转对象,然后才翻译它,至少与您的想法相符...