Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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转换矩阵运算_Java_Math_Graphics_Matrix_Transformation - Fatal编程技术网

Java转换矩阵运算

Java转换矩阵运算,java,math,graphics,matrix,transformation,Java,Math,Graphics,Matrix,Transformation,我试图维护并使用一个计算机图形程序的转换矩阵。它是一个3x3矩阵,存储(x,y)点的缩放、旋转和平移信息 我的程序可以处理任何个案。。。i、 e.如果我只缩放或只旋转,效果很好。但是,当组合缩放和旋转时,它似乎不起作用,我认为这与我如何在代码中组合旋转和缩放有关。该矩阵称为变换,类型为float。以下方法清除、旋转、缩放和平移(按该顺序)矩阵 public void clearTransform() { transformation[0][0] = 1;transformation[0]

我试图维护并使用一个计算机图形程序的转换矩阵。它是一个3x3矩阵,存储(x,y)点的缩放、旋转和平移信息

我的程序可以处理任何个案。。。i、 e.如果我只缩放或只旋转,效果很好。但是,当组合缩放和旋转时,它似乎不起作用,我认为这与我如何在代码中组合旋转和缩放有关。该矩阵称为变换,类型为float。以下方法清除、旋转、缩放和平移(按该顺序)矩阵

public void clearTransform()
{
    transformation[0][0] = 1;transformation[0][1] = 0;transformation[0][2] = 0;
    transformation[1][0] = 0;transformation[1][1] = 1;transformation[1][2] = 0;
    transformation[2][0] = 0;transformation[2][1] = 0;transformation[2][2] = 1;
}

public void rotate (float degrees)
{
    double r = degrees * (Math.PI/180);
    float sin = (float)Math.sin(r);
    float cos = (float)Math.cos(r);
    transformation[0][0] *= cos;
    transformation[1][1] *= cos;
    if(transformation[0][1] == 0)
        transformation[0][1] = -sin;
    else 
        transformation[0][1] *= -sin;
    if(transformation[1][0] == 0) 
        transformation[1][0] = sin;
    else 
        transformation[1][0] *= sin;
}

public void scale (float x, float y)
{
    transformation[0][0] *= x;
    transformation[1][1] *= y;
}

public void translate (float x, float y)
{
    transformation[0][2] += x;
    transformation[1][2] += y;
}
对于比例,矩阵包含如下信息:

(Sx,0,0) (0,Sy,0) (0,0,1)

对于旋转,如下所示:

(cos(θ),-sin(θ),0) (sin(θ),cos(θ),0) (0,0,1)

对于翻译,这是:

(1,0,Tx) (0,1,Ty) (0,0,1)

我认为我没有正确地结合缩放和旋转。下面是我实际应用转换的地方:

public float[] transformX(float[] x, float[] y, int n) {
    float[] newX = new float[n];
    for(int i = 0; i < n; i ++) {
        newX[i] = (x[i] * transformation[0][0]) + (y[i] * transformation[0][1]) + transformation[0][2];
    }
    return newX;
}

public float[] transformY(float[] x, float[] y, int n) {
    float[] newY = new float[n];
    for(int i = 0; i < n; i ++) {
        newY[i] = (x[i] * transformation[1][0]) + (y[i] * transformation[1][1]) + transformation[1][2];
    }
    return newY;
}
public float[]x(float[]x,float[]y,int-n){
float[]newX=新的float[n];
对于(int i=0;i
其中x和y是预变换的点阵列,n是点的数量


谢谢你的帮助

我认为正确的转换应该是:


因为您似乎只是在变换二维,所以也可以使用Java2D
仿射变换
类:Nice,但是
旋转
应该是与旧值的矩阵乘法;0上的ifs无权出现在那里。通常,您需要一个临时矩阵来将新值写入。也许您可以借用java的现有代码。我最初将这两个值作为(*=-sin)和(*=sin),但如果它们为0(应用第一次旋转时总是这样),那么值将保持为0。