AffineTransform实例的串联是否需要Java中的特定顺序?

时间:2012-02-07 12:23:46

标签: java java-6 affinetransform

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

  1. 一个原始的变形'原始',它可以扩展和翻译2。一个单位矩阵'one'
  2. 一个单位矩阵'two'
  3. 一个变形'尺度',可以缩放
  4. 一个转换'翻译'翻译
  5. 在示例中,我创建了以下组合: 1.一个x刻度x平移 2.两个x translatex量表

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

    Java版:Java 6 SE Update 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是否存在问题或我的代码中是否有错误?
    谢谢你的提示。

3 个答案:

答案 0 :(得分:1)

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

Example1

Example2

答案 1 :(得分:1)

订单确实很重要。 看看你的第二个连接,你实际上是在扩展你的翻译,因为它之前被应用了。

答案 2 :(得分:0)

线性代数(矩阵的数学模型)与基本代数不同。最简单的差异之一是乘法不是可交换的。所以A x B将得到与B x A不同的结果。