java - 从变换矩阵中寻找角度

标签 java math

我有一个包含这样值的变换矩阵。

变换:分别为 xx、xy、yx、yy、tx 和 ty。

如何从上面的一组给定值中找到角度。

最佳答案

如果只是关于旋转,可以使用给定矩阵变换 vector (1,0),并计算结果 vector 与 x 轴之间的角度,如对原始问题的评论中所述

import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.util.Random;


public class ExtractRotation
{
    public static void main(String[] args)
    {
        for (int i=0; i<=180; i++)
        {
            double angleRad = Math.toRadians(i);
            AffineTransform at = createRandomTransform(angleRad);
            double extractedAngleRad = extractAngle(at);
            System.out.println(
                "In: "+Math.toDegrees(angleRad)+ " " +
                "Out "+Math.toDegrees(extractedAngleRad));
        }
    }

    private static double extractAngle(double m[])
    {
        return extractAngle(new AffineTransform(m));
    }
    private static double extractAngle(AffineTransform at)
    {
        Point2D p0 = new Point();
        Point2D p1 = new Point(1,0);
        Point2D pp0 = at.transform(p0, null);
        Point2D pp1 = at.transform(p1, null);
        double dx = pp1.getX() - pp0.getX();
        double dy = pp1.getY() - pp0.getY();
        double angle = Math.atan2(dy, dx);
        return angle;
    }

    private static Random random = new Random(0); 
    private static AffineTransform createRandomTransform(double angleRad)
    {
        AffineTransform at = new AffineTransform();
        double scale = 1.0;
        at.translate(randomDouble(), randomDouble());
        scale = Math.abs(randomDouble());
        at.scale(scale, scale);
        at.rotate(angleRad);
        at.translate(randomDouble(), randomDouble());
        scale = Math.abs(randomDouble());
        at.scale(scale, scale);
        return at;
    }

    private static double randomDouble()
    {
        return -5.0 + random.nextDouble() * 10;
    }


}

关于java - 从变换矩阵中寻找角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21561909/

相关文章:

Java删除重复数据

java - 如何使用 Java 将文件传递给 Jenkins

algorithm - 从数学的角度来看,分布式算法的执行是什么?

math - 如何通过系统测量事件发生率

python - numpy 任意精度线性代数

ios - 将 Z 分数转换为百分位数( objective-c )

java - 在 Windows、OSX 和 Linux 上获取进程的 PID

Java 和 SSH 希望从一个文件执行多个命令,跨另一个文件中的主机列表并将输出写入文件

java - 从一个类获取字符串以写入前屏幕类

python - 如何将函数或运算符作为参数传递给 Python 中的函数?