Java转换矩阵运算 [英] Java transformation matrix operations
问题描述
我正在尝试维护然后将转换矩阵用于计算机图形程序.这是一个3x3的矩阵,可以存储(x,y)点的缩放,旋转和转换信息.
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.
我的程序可以处理任何情况...即,如果我仅缩放或仅旋转它,则效果很好.但是,当组合缩放和旋转时,它似乎不起作用,我认为这与我在代码中组合旋转和缩放的方式有关.该矩阵称为转换,类型为float.以下方法清除,旋转,缩放和平移(按此顺序)矩阵.
My program can handle any individual case... i.e. 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)
(Sx, 0, 0) (0, Sy, 0) (0, 0, 1)
旋转,像这样:
(cos(theta),-sin(theta),0) (sin(theta),cos(theta),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)
(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;
}
其中x和y是预先转换的点数组,n是点数
Where x and y are the pre-transformed point arrays, and n is the number of points
谢谢您的帮助!
推荐答案
我认为正确的转换应该是:
I think the correct transformation should be:
这篇关于Java转换矩阵运算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!