Java:2D中的矩阵旋转不起作用
我有一个3x3矩阵,我用它来进行基本的变换,比如平移、缩放和旋转,但是旋转部分没有正常工作。对于大于30度左右的任何角度,它只是看起来。。维尔德 方法如下所示: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]
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值。答对了!谢谢,非常感谢。