Java:二维矩阵旋转不起作用

标签 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;
}

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

正如我所说,平移和缩放正在正常工作。

最佳答案

我能想到的是,由于您为获取每个 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];

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

关于Java:二维矩阵旋转不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12591772/

相关文章:

java - Eclipselink 更新现有表

c++ - 如何继承矩阵类?

java - Android Surface类Surface.ROTATION_无法解析或不是字段

java - 类型不接受泛型中的参数

java - 如何分别从 HashMap 获取对象?

c - 如何使用此 C 代码使用 Strassen 算法将两个矩阵相乘?

html - Internet Explorer 不抗锯齿旋转图像

swift - ARKit 无法在垂直平面上正确旋转 SCNNode

java - 我可以调试另一个项目 netbeans 中存在的 Restful Web 服务吗

python - 如何从python中的数组(或矩阵)中提取除一列之外的所有列?