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是點
數量感謝您的幫助!
因爲它似乎你只轉化兩個方面,你也可以使用Java2D的'AffineTransform'類:http://docs.oracle.com /javase/tutorial/2d/advanced/transforming.html –
不錯,但是'rotate'應該是與舊值的矩陣乘法; 0上的ifs無權在那裏。一般來說,你需要一個臨時矩陣來寫入新的值。也許你可以從Java中借用現有的代碼。 –
我最初有這兩個爲(* = -sin)和(* = sin),但是如果它們是0,(這在應用第一次旋轉時總是如此),那麼這些值將保持爲0。 – user1028885