PDF 1.7-CTM(当前转换矩阵)是如何工作的?

PDF 1.7-CTM(当前转换矩阵)是如何工作的?,pdf,matrix,Pdf,Matrix,在阅读了之后,我仍然无法理解如何正确地创建转换矩阵 第4.2/4.3节中的规范说明了以下内容: •翻译指定为[1 0 0 1 tx ty],其中tx和ty 是平移坐标系原点的距离 分别为水平和垂直尺寸。 通过[sx 0 sy 0 0]获得缩放。这将缩放坐标 使1号机组在水平和垂直方向上的尺寸达到新的要求 坐标系的大小分别与sx和sy单位相同, 在上一个坐标系中。旋转由[ cosθsinθ−sinθcosθ0],具有旋转 以θ角逆时针旋转坐标系轴。倾斜为 由[1 tanαtanβ1 0 0]指定,

在阅读了之后,我仍然无法理解如何正确地创建转换矩阵

第4.2/4.3节中的规范说明了以下内容:

•翻译指定为[1 0 0 1 tx ty],其中tx和ty 是平移坐标系原点的距离 分别为水平和垂直尺寸。
通过[sx 0 sy 0 0]获得缩放。这将缩放坐标 使1号机组在水平和垂直方向上的尺寸达到新的要求 坐标系的大小分别与sx和sy单位相同, 在上一个坐标系中。
旋转由[ cosθsinθ−sinθcosθ0],具有旋转 以θ角逆时针旋转坐标系轴。
倾斜为 由[1 tanαtanβ1 0 0]指定,它通过 角度α和y轴之间的夹角β

考虑到这一点,如何准确地使用相互之间的顺序转换

我可以成功地同时使用
平移
旋转
,但是当我尝试同时使用
缩放
倾斜
时,事情会严重出错。也许我使用CTM不正确,或者甚至我的数学也不正确。我试图在坐标位置(50,50)创建文本,旋转45度,缩放2(按该顺序)。我之所以说“按顺序”是因为规范说明转换的顺序会产生差异(规范给出了基于转换顺序的差异的图形示例)。那么流对象看起来是什么样子和/或矩阵数学在这里是如何应用的呢

工作(转换(50,50)+45度旋转)

当我尝试进行矩阵乘法以增加缩放时,它似乎不起作用:

[  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 ]
数学似乎是正确的,只是现在文本从坐标(100100)开始,而不是从坐标(5050)开始。这对我来说似乎并不正确,因为我试图从(50,50)开始,旋转45度,然后缩放2度

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

但这确实有道理。如果先按(50,50)进行翻译,然后按2进行缩放,则可以有效地按(50,50)乘以2,即(100,100)

您似乎需要的是首先缩放两倍(使对象的大小达到两倍,但尚未移动或旋转),然后旋转和平移(不影响平移),即

挥手:你说这话的时候心里想的是什么

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


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

操作符Tm用于设置文本矩阵,在呈现文本时,该矩阵与当前变换矩阵相结合


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

顺便说一句,您以另一种方式执行了第一个矩阵乘法,旋转x平移给出了结果,不是你写的平移x旋转。啊,你是对的,先生。所以我在代码中正确地实现了转换,但我只是没有正确地在头脑中传达我想要的东西(即,在点(50,50)处45度角的文本是正常大小的两倍)?还有,PDF 1.7(ISO 32000-1:2008)标准有一种方法可以自动为我做矩阵乘法,或者我必须编码吗?你不需要自己做矩阵乘法。如果将操作用于ctm操纵,而不是文本矩阵操纵,则这些操作将组合在一起:新操作将从左侧与现有ctm相乘。是
A cm B cm C cm
(C x B x A)cm
相同。我想更容易将其视为'M cm'与'CURRENT_MATRIX=M x CURRENT_MATRIX'相同
[  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 ]
[ 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 ]