简体   繁体   中英

Java transformation matrix operations

I'm trying to maintain and then use a transformation matrix for a computer graphics program. It's a 3x3 matrix that stores scale, rotate, and translate information for (x,y) points.

My program can handle any individual case... ie if I only scale or only rotate it works fine. However, it does not seem to work when combining scale and rotate, and I think that has to do with how I combine rotation and scale in the code. The matrix is called transformation and is of type float. The following methods clear, rotate, scale, and translate (in that order) the matrix.

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

For scale, the matrix hold info like this:

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

for rotation, like this:

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

for translation, this:

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

I don't think I'm correctly combining scale and rotate. Here is where I actually apply the transformation:

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

Where x and y are the pre-transformed point arrays, and n is the number of points

Thank you for any help!

I think the correct transformation should be:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM