gpt4 book ai didi

java - 给定 AffineTransform,我如何确定旋转、镜像、缩放等?

转载 作者:行者123 更新时间:2023-12-02 01:00:13 29 4
gpt4 key购买 nike

我正在解决分析 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 实例,我认为可以确定:

  • 缩放X
  • 缩放Y
  • 旋转
  • 剪切

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

最佳答案

可以将仿射变换表示为平移、旋转、反射、缩放和剪切的序列。计算它们的方法称为 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 分解)

关于java - 给定 AffineTransform,我如何确定旋转、镜像、缩放等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60761670/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com