2012-01-25 143 views
1

我試圖維護,然後使用計算機圖形程序的變換矩陣。它是一個3x3矩陣,用於存儲縮放,旋轉和平移(x,y)點的信息。Java變換矩陣運算

我的程序可以處理任何個別情況...即,如果我只是縮放或只旋轉它工作正常。但是,在合併縮放和旋轉時似乎並不奏效,我認爲這與我如何在代碼中組合旋轉和縮放有關。該矩陣被稱爲轉換並且是浮點類型。以下方法清除,旋轉,縮放和翻譯(按此順序)矩陣。

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(THETA),-sin(THETA),0) (SIN(THETA),COS(THETA),0) (0,0,1)

˚F或翻譯,這樣的:

(1,0,TX) (0,1,泰) (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; 
} 

其中X和Y是預變換點陣列,n是點

數量感謝您的幫助!

+4

因爲它似乎你只轉化兩個方面,你也可以使用Java2D的'AffineTransform'類:http://docs.oracle.com /javase/tutorial/2d/advanced/transforming.html –

+3

不錯,但是'rotate'應該是與舊值的矩陣乘法; 0上的ifs無權在那裏。一般來說,你需要一個臨時矩陣來寫入新的值。也許你可以從Java中借用現有的代碼。 –

+0

我最初有這兩個爲(* = -sin)和(* = sin),但是如果它們是0,(這在應用第一次旋轉時總是如此),那麼這些值將保持爲0。 – user1028885

回答

2

我認爲正確的轉換應該是:

enter image description here