阅读Adobe PDF 1.7 (ISO 32000-1:2008) specification后,我仍然无法理解如何正确创建转换矩阵。
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轴倾斜a 角度α和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
当我尝试使用矩阵乘法来添加缩放时,它似乎不起作用:
[ 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 ]
数学似乎是正确的,除了现在文本从坐标(100,100)开始而不是(50,50)。这对我来说似乎不正确,因为我试图从(50,50)开始,旋转45度,然后将其缩放2。
答案 0 :(得分:6)
数学似乎是正确的,除了现在文本从坐标(100,100)开始而不是(50,50)。这对我来说似乎不正确,因为我试图从(50,50)开始,旋转45度,然后将其缩放2。
但确实有意义。如果您首先翻译(50,50)然后按2缩放,则有效地翻译两倍(50,50),即(100,100)。
你似乎需要首先按比例缩放2(大小为两倍,但尚未移动或旋转),然后才旋转和翻译(不会影响翻译的缩放),即
[ 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 ]
有些挥手:你说的时候想到了什么
我试图在坐标位置(50,50)创建文本,旋转45度,缩放2(按此顺序)。
肯定是在翻译成(50,50)后,以下操作应该保持点(50,50)固定。但这不是其他操作所做的,它们保持原点(0,0)固定。因此,您应该首先在原点缩放和旋转对象,然后才对其进行翻译,至少与您的想法相符...
答案 1 :(得分:3)
运算符Tm用于设置文本矩阵,在渲染文本时与文本矩阵结合使用。
相反,您可以使用cm运算符(连接矩阵),它将为您执行所有数学运算。如果要保留在开始输出文本之前使用的原始矩阵,可以使用运算符q / Q来保存/恢复当前图形状态。