PDF 1.7 - CTM(当前转换矩阵)的工作原理是什么?

时间:2013-11-11 14:14:36

标签: pdf matrix

阅读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轴成角度β。

鉴于此,一个人如何按顺序使用转换?

我可以一起成功使用TranslationRotation,但当我尝试使用ScalingSkewing时,事情就会出现严重错误。也许我错误地使用了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。

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来保存/恢复当前图形状态。