16

阅读Adob​​e 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 θ 0 0 ] 产生,其效果是将坐标系轴逆时针旋转角度θ。
• 倾斜由[ 1 tan α tan β 1 0 0 ] 指定,它使x 轴倾斜角度α 和y 轴倾斜角度β。

鉴于此,一个人究竟是如何按顺序使用转换的呢?

我可以成功地将TranslationandRotation一起使用,但是当我尝试同时使用时,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。

4

2 回答 2

10

数学似乎是正确的,除了现在文本从坐标 (100, 100) 而不是 (50, 50) 开始。这对我来说似乎不正确,因为我试图从 (50, 50) 开始,旋转 45 度,然后将其缩放 2。

但这确实有道理。如果您首先平移 (50, 50),然后缩放 2,则您有效地平移 (50, 50) 乘以 2,即 (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 ]

一些挥手:当你说的时候你在想什么

我试图在坐标位置 (50, 50) 创建文本,旋转 45 度,缩放 2(按此顺序)。

肯定是在转换为 (50, 50) 之后,以下操作应该使点 (50, 50) 保持不变。但这不是其他操作所做的,它们保持原点 (0,0) 固定。因此,您应该首先在原点缩放和旋转对象,然后再平移它,至少要与您的想法相匹配...

于 2013-11-11T15:02:53.040 回答
3

运算符 Tm 用于设置文本矩阵,在呈现文本时与当前变换矩阵结合。

相反,您可以使用 cm 运算符(连接矩阵),它将为您完成所有数学运算。如果要保留开始输出文本之前使用的原始矩阵,可以使用运算符 q/Q 保存/恢复当前图形状态。

于 2013-11-11T19:32:55.430 回答