后记

时间:2017-07-07 19:00:28

标签: postscript skew

我正在尝试将倾斜应用于postscript中的图像。我成功完成了:

[1 -0.5 -0.5 1 0 0] concat

其中-0.5指的是垂直和水平轴上22.5度的倾斜。问题是偏斜不居中,图像的中心被移动,因此在应用歪斜后我的图像不会保持在相同的位置。

如何在保持位置的同时应用歪斜?我尝试在倾斜之前/之后翻译图像,但是我找不到要翻译图像的数量,所以它总是保持在相同的位置。

2 个答案:

答案 0 :(得分:1)

通过改变当前的变换矩阵进行倾斜工作,它根本不居中。

除非您进一步更改CTM,否则将从左下角描述图像,这是从自上而下绘制图像的环境打印到PostScript时的常见做法。

基本上,要解决您的问题,您需要了解PLRM中描述的矩阵操作和数学。

假设您在绘制图像之前的点处应用了concat,并且没有进行任何其他CTM操作,则图像的左下角为0,0。 concat不会影响它(除非你在矩阵中有一个Tx和Ty成员),但它会改变图像的绘制位置。您需要做的是在正常绘制时计算图像中心的坐标,计算在应用修改后的CTM后坐标最终结束的位置,然后通过添加Tx和Ty来调整剪切矩阵值使得中心坐标处于所需位置。或者适当地翻译原点。

关键点(可能)是图像有自己的矩阵,它应用于CTM之上;为了计算图像中心的用户空间坐标,您必须自己将图像矩阵应用于CTM。并且您需要再次应用剪切矩阵来计算变换图像中心的位置。一旦你获得了香草图像中心和剪切图像中心的坐标,你就知道如何平移当前点,使中心坐标保持不变。

你没有提供一个例子,所以我不能为你工作,我没有一个简单的工作。如果我有时间的话,我会尝试拿出一个,如果我这样的话,我会把它发布在这里。

答案 1 :(得分:1)

好的,我终于找到了办法。首先,像往常一样使用translate:

定位元素
1135 568 translate

然后,仅在一个轴X或Y上歪斜,而不是同时歪斜。矩阵中的数字是tan(skew_angle),例如,对于X轴上的20度角:

[1 0 0.3639 1 0 0] concat

在此之后,翻译图像,因为现在图像边界框的宽度更大,我们可以将此额外宽度计算为additional_width = abs(object_height * tan(skew_angle))。所以现在我们翻译这个宽度的一半:

{additional_width/2} 0 translate

现在我们以同样的方式对Y进行倾斜:

[1 0.3639 0 1 0 0] concat

并将额外身高计算为additional_height = abs(object_width * tan(skew_angle))

0 {additional_height/2} translate

这样,在应用歪斜后,物体中心保持在相同的位置。