Java转换矩阵运算 [英] Java transformation matrix operations

查看:86
本文介绍了Java转换矩阵运算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试维护然后将转换矩阵用于计算机图形程序.这是一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆