【问题标题】:Does concatenation of AffineTransform instances require a specific order in Java?AffineTransform 实例的串联是否需要 Java 中的特定顺序?
【发布时间】:2012-02-07 12:23:45
【问题描述】:

我有一组 AffineTranform 实例。根据具体条件,我需要连接其中的任何一个 - 条件在这里并不重要。这样做时,我发现连接的顺序似乎很重要。看看这个例子,我有:

  1. 一个可缩放和平移的原始转换“原始”2。一个单位矩阵“一”
  2. 一个单位矩阵“二”
  3. 一个可扩展的转换“规模”
  4. 一个翻译“翻译”的转换

在示例中,我创建了以下组合: 1. 一个 x 比例 x 翻译 2. 两个 x 平移刻度

按照 Java 文档,矩阵在连接时应该相乘,但是查看示例代码的输出会显示不同的结果。

Java 版本:Java 6 SE 更新 30

示例:

package affinetransformationtest;

import java.awt.geom.AffineTransform;

public class AffineTransformationTest {

    public static void main(String[] args) {
        AffineTransform original = new AffineTransform(10, 0.0, 0.0, 100, 2, 3);
        System.out.println("original: " + original);
        System.out.println("");

        AffineTransform scale = AffineTransform.getScaleInstance(10, 100);
        AffineTransform translate= AffineTransform.getTranslateInstance(2, 3);

        AffineTransform one = new AffineTransform();
        System.out.println("one: " + one);
        one.concatenate(scale);
        System.out.println("one + scale: " + one);
        one.concatenate(translate);
        System.out.println("one + scale + translate: " + one);
        System.out.println("Is one equal to original: " + original.equals(one)); //is false
        System.out.println("");

        AffineTransform two = new AffineTransform();
        System.out.println("two: " + two);
        two.concatenate(translate);
        System.out.println("two + translate: " + two);
        two.concatenate(scale);
        System.out.println("two + translate + scale: " + two);
        System.out.println("Is two equal to original: " + original.equals(two)); //is true
        System.out.println("");
    }
}

输出:

original: AffineTransform[[10.0, 0.0, 2.0], [0.0, 100.0, 3.0]]

one: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
one + scale: AffineTransform[[10.0, 0.0, 0.0], [0.0, 100.0, 0.0]]
one + scale + translate: AffineTransform[[10.0, 0.0, 20.0], [0.0, 100.0, 300.0]]
Is one equal to original: false

two: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
two + translate: AffineTransform[[1.0, 0.0, 2.0], [0.0, 1.0, 3.0]]
two + translate + scale: AffineTransform[[10.0, 0.0, 2.0], [0.0, 100.0, 3.0]]
Is two equal to original: true

是 Java 有问题还是我的代码有错误?
感谢您的任何提示。

【问题讨论】:

    标签: java java-6 affinetransform


    【解决方案1】:

    顺序确实很重要。 看看你的第二个连接,你实际上也在缩放你的翻译,因为它之前被应用过。

    【讨论】:

    • 嗯,你是对的。所以我必须重新考虑我的解决方案:) 谢谢!
    • 是的,绝对不可交换,就像通常的矩阵运算一样(除了加法 - 你知道我的意思)。
    【解决方案2】:

    是的,矩阵乘法的顺序很重要。查看这些简单的示例,其中相同的矩阵以不同的顺序相乘:

    Example1

    Example2

    【讨论】:

      【解决方案3】:

      线性代数(矩阵的数学模型)不同于基本代数。最简单的区别之一是乘法不是可交换的。所以 A x B 会给出与 B x A 不同的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多