在后记中居中 shear/skew

Centered shear/skew in postscript

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

[1 -0.5 -0.5 1 0 0] concat

其中 -0.5 均表示在垂直轴和水平轴上倾斜 22.5 度。问题是倾斜不居中,图像的中心移动了,所以我的图像在应用倾斜后不会停留在相同的位置。

如何在保持位置的同时应用倾斜?我尝试翻译图像 before/after 倾斜但我找不到我应该翻译多少图像所以它总是保持在相同的位置。

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

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

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

假设您在绘制图像之前的那一刻应用了连接,并且没有发生其他 CTM 操作,那么图像的左下角位于 0,0。 concat 不会影响它(除非矩阵中有 Tx 和 Ty 成员),但它会改变图像的绘制位置。您需要做的是计算正常绘制时图像中心的坐标,计算应用修改后的 CTM 后该坐标将结束的位置,然后通过添加 Tx 和 Ty 来调整剪切矩阵中心坐标将位于所需位置的值。或者适当翻译出处。

关键点(可能)是图像有自己的矩阵,它应用在 CTM 之上;为了计算图像中心的用户 space 坐标,您必须自己将图像矩阵应用于 CTM。您还需要应用剪切矩阵再次执行此操作,以计算转换后图像中心的位置。一旦你有了原始图像的中心坐标和剪切图像的中心坐标,你就知道如何平移当前点以使中心坐标保持不变。

您没有提供示例,所以我无法为您完成,而且我手头也没有简单的工作示例。如果我有时间,我会尝试想出一个,如果我这样做的话,我会 post 在这里。

好的,我终于找到方法了。首先,像往常一样使用 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

这样,应用倾斜后对象中心保持在相同位置。