Java:2D中的矩阵旋转不起作用

时间:2012-09-25 22:05:40

标签: java matrix rotation transformation

我有这个3x3矩阵,我用它来预先形成基本的变换,如平移,缩放和旋转,但旋转部分不能正常工作。对于大于30度左右的任何角度,它看起来都很奇怪。

方法如下:

public void rotate(float angle) {
    double rads = angle * (Math.PI/180);
    float sin = (float) Math.sin(rads);
    float cos = (float) Math.cos(rads);

    matrix[0][0] = cos;
    matrix[0][1] = -sin;
    matrix[1][0] = sin;
    matrix[1][1] = cos; 
}

应用转换的方法:

对于X:

public float[] applyTransformX(float[] x, float[] y) {
    float[] transformed = new float[x.length];
    for(int i=0; i<x.length; i++) {
        transformed[i] = (x[i] * matrix[0][0]) + (y[i] * matrix[0][1] + matrix[0][2]);
        System.out.println((x[i] * matrix[0][0]) + (y[i] * matrix[0][1] + matrix[0][2]));

    }
    return transformed;
}

对于Y:

public float[] applyTransformY(float[] x, float[] y) {
    float[] transformed = new float[x.length];
    for(int i=0; i<x.length; i++) {
        transformed[i] = (x[i] * matrix[1][0]) + (y[i] * matrix[1][1] + matrix[1][2]);
    }
    return transformed;
}

我在这里缺少什么基本的东西?我知道我没有围绕固定点进行转换。这也许是我遇到这个问题的原因吗?

正如我所说,翻译和扩展正在按预期工作。

2 个答案:

答案 0 :(得分:1)

我能想到的一点是,由于您为每个x[i]添加的三个术语的大小存在差异,并且每个y[i]都会出现舍入错误}。我的直觉是最后添加翻译术语,因此相当大的翻译不会导致旋转术语中的重要性丢失。这只需要你删除一些括号,这样就可以实现标准的从左到右的操作顺序。换句话说,在计算X值的方法中,写一下:

transformed[i] = x[i] * matrix[0][0] + y[i] * matrix[0][1] + matrix[0][2];

没有任何括号。同样,在计算Y值时,写

transformed[i] = x[i] * matrix[1][0] + y[i] * matrix[1][1] + matrix[1][2];

如果这没有帮助,那么请发布一些实际数字,以便我们可以看到哪些计算可能导致重要性丧失。事实上,对于小角度这种方法是可行的,这表明您看到的是舍入误差,而不是实际的错误计算方法。

答案 1 :(得分:0)

问题出在两种情况下transformed[i]的计算中: 对于X应该是:

transformed[i] = (x[i] * matrix[0][0]) + (y[i] * matrix[0][1]);

对于Y应该是:

transformed[i] = (x[i] * matrix[1][0]) + (y[i] * matrix[1][1]);

如果你包含matrix[0][2]matrix[1][2]这对于Z组件会有所帮助,但是对于围绕Z轴的旋转,它们应该评估为0(matrix[2][2]将是1,尽管是完整的)。你可能只是忘了重新初始化它们......