我正在尝试维护,然后使用转换矩阵进行计算机图形程序。它是一个3x3矩阵,用于存储(x,y)点的比例,旋转和平移信息。
我的程序可以处理任何个别情况...即,如果我只缩放或只旋转它工作正常。但是,它在组合缩放和旋转时似乎不起作用,我认为这与我如何在代码中组合旋转和缩放有关。矩阵称为变换,属于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(theta), - sin(theta),0) (sin(theta),cos(theta),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;
}
其中x和y是预变换点阵列,n是点数
感谢您的帮助!
答案 0 :(得分:3)
我认为正确的转变应该是: