Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:2D中的矩阵旋转不起作用_Java_Matrix_Rotation_Transformation - Fatal编程技术网

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

Java:2D中的矩阵旋转不起作用,java,matrix,rotation,transformation,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]

我有一个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;
}
public float[]applyTransformX(float[]x,float[]y){
浮点[]转换=新浮点[x.长度];

对于(int i=0;i而言,问题在于两种情况下的
转换[i]
计算: 对于X,它应该是:

transformed[i] = (x[i] * matrix[0][0]) + (y[i] * matrix[0][1]);
transformed[i] = (x[i] * matrix[1][0]) + (y[i] * matrix[1][1]);
对于Y,它应该是:

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

如果包含
矩阵[0][2]
矩阵[1][2]
这将适用于Z分量,但是如果绕Z轴旋转,这些值应计算为0(
矩阵[2][2]
将为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];

如果这没有帮助,那么请发布一些实际数字,这样我们就可以看到哪些计算可能会导致显著性损失。事实上,这对于小角度来说是可行的,这表明您看到的是舍入误差,而不是实际不正确的计算方法。

这是需要转换为t的情况之一吗首先是原点,然后是旋转,然后是向后平移?(不是将数字3在3点钟位置颠倒,而是将数字3 24小时旋转到9点钟位置?@johngarder:不,每个转换当前都是独立运行的。
矩阵
的数据类型是什么?@DavidWallace:float[]矩阵=新浮点[3][3] 不,这些术语只是因为他在做平移和旋转/缩放。术语
矩阵[0][2]
矩阵[1][2]
只是他在各个方向上翻译的数量。我尝试了你的建议,但据我所知没有任何影响。你可以在这里看到整个代码:--也许你看到了一些明显的错误。但是你的想法似乎是合理的。你的X值看起来不错。你的Y值没有。你确定你没有更改
X吗
y
数组,然后再调用
ApplyTransformorMy
方法?请记住,在该方法中,您需要的是原始的X值,而不是转换后的值。事实上,再次查看您的数字,在计算Y值。答对了!谢谢,非常感谢。