考虑到AffineTransform,如何确定旋转,镜像,缩放等?

问题描述 投票:0回答:1

我正在研究分析PDF中的图像时遇到的问题。有时图像会被调整大小,旋转,镜像等。我可以使用AffineTransform来访问PDF上下文矩阵:

例如:

调整大小的图像:

AffineTransform[[432.2279052734375, 0.0, 90.0], [0.0, 150.67495727539062, 555.257080078125]]

旋转/镜像:

AffineTransform[[593.25, 0.0, 0.0], [0.0, -768.0, 768.1500244140625]]

鉴于AffineTransform实例,我认为可以确定:

  • scaleX
  • scaleY
  • 旋转
  • 剪切

[不幸的是,我的几何技能不足(至少可以说)。谁能指出我进行这些计算的正确方向?

java geometry
1个回答
1
投票

可以将仿射变换表示为平移,旋转,反射,比例和剪切的序列。计算它们的方法称为matrix decomposition

软件包有很多选择,例如JAMA packageApache Commons Math

Singular value decomposition (SVD)使您分解为旋转,然后缩放,然后再旋转。

这是一个使用JAMA计算剪切机的SVD,并从中提取旋转角度和比例因子的示例:

import Jama.*;

public class Demo {
    public static void main(String[] args) {
        double[][] vals = {{1, 1}, {0, 2}};
        Matrix a = new Matrix(vals);
        SingularValueDecomposition svd = a.svd();
        Matrix u = svd.getU();
        Matrix v = svd.getV();
        double[] s = svd.getSingularValues();
        System.out.printf("rotate=%f scaleX=%f scaleY=%f rotate=%f\n",
                Math.toDegrees(Math.atan2(u.get(0, 1), u.get(0, 0))),
                s[0], s[1],
                Math.toDegrees(Math.atan2(v.get(0, 1), v.get(0, 0))));
    }
}

输出告诉您它旋转了76度,接着是X刻度和Y刻度,然后是58度旋转:

rotate=-58.282526 scaleX=2.288246 scaleY=0.874032 rotate=-76.717474

请注意:如果您的转换涉及翻转图像,则此代码将不起作用。 JAMA中的SVD例程会将镜像与旋转之一合并。由于您只有2x2矩阵,因此您可能需要考虑编写自己的专用SVD实现。

[通过其他矩阵分解,您可以得到其他表示形式,例如,剪切标度剪切(LU反压缩)或旋转标度剪切(QR反压缩)

© www.soinside.com 2019 - 2024. All rights reserved.