后记中的居中剪切/倾斜



我正在尝试在后记中对图像应用倾斜。我已经成功地做到了:

[1 -0.5 -0.5 1 0 0] concat

其中两个-0.5是指垂直轴和水平轴上 22.5 度的倾斜。问题是倾斜没有居中,图像的中心被移动,所以我的图像在应用倾斜后不会停留在同一位置。

如何在保持位置的同时应用倾斜?我尝试在倾斜之前/之后翻译图像,但我找不到应该平移多少图像,以便它始终保持在同一位置。

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

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

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

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

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

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

好的,我终于找到了办法。首先,像往常一样使用翻译来定位元素:

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

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

相关内容

  • 没有找到相关文章

最新更新