旋转所有矩形角

时间:2015-05-04 17:39:37

标签: java math rotation lwjgl

我正在做一个你是宇宙飞船的游戏。这艘宇宙飞船必须能够旋转。矩形有两个数组x[]y[]包含矩形的所有角位置。但是当我应用旋转公式时,我得到一个相当奇怪的旋转。为了解释它,它看起来像是在屏幕的左下方旋转。

要制作这些角落阵列,我需要处于x位置,y位置,宽度和高度。

制作角落阵列

public Vertex2f(float x, float y, float w, float h){
    this.x[0] = x; 
    this.y[0] = y;

    this.x[1] = x+w;
    this.y[1] = y;

    this.x[2] = x+w;
    this.y[2] = y+h;

    this.x[3] = x;
    this.y[3] = y+h;
}

我的轮换功能

public void rotate(float angle){
    this.rotation = angle;

    double cos = Math.cos(rotation);
    double sin = Math.sin(rotation);

    for(int i = 0; i < x.length; i++){
        x[i] = (float)(cos * x[i] - sin * y[i]);
        y[i] = (float)(sin * x[i] + cos * y[i]);

    }

}

如果有帮助我在java中使用LWJGL / OpenGL来获取所有图形,并使用Slick2d来加载和初始化我正在使用的精灵。

2 个答案:

答案 0 :(得分:0)

试试这个:

public void rotate(float angle){
    this.rotation = angle;

    double cos = Math.cos(rotation);
    double sin = Math.sin(rotation);

    double xOffset = (x[0]+x[2])/2;
    double yOffset = (y[0]+y[2])/2;

    for(int i = 0; i < 3; i++){
        x[i] = (float)(cos * (x[i]-xOffset) - sin * (y[i]-yOffset)) + xOffset;
        y[i] = (float)(sin * (x[i]-xOffset) + cos * (y[i]-yOffset)) + yOffset;

    }

}

你必须围绕矩形的中心旋转。否则中心位于x = 0且y = 0

编辑:

public void rotate(float angle){
    this.rotation = angle;

    double cos = Math.cos(rotation);
    double sin = Math.sin(rotation);

    double xOffset = (x[0]+x[2])/2;
    double yOffset = (y[0]+y[2])/2;

    for(int i = 0; i < 3; i++){
        double newX = (float)(cos * (x[i]-xOffset) - sin * (y[i]-yOffset)) + xOffset;
        double newY = (float)(sin * (x[i]-xOffset) + cos * (y[i]-yOffset)) + yOffset;

        x[i] = newX;
        y[i] = newY;
    }
}

请参阅other thread

答案 1 :(得分:0)

公式的问题

    x[i] = (float)(cos * x[i] - sin * y[i]);
    y[i] = (float)(sin * x[i] + cos * y[i]);

除了丢失的旋转中心之外,您在第一个公式中更改了x[i],但希望在第二个公式中使用原始值。因此,您需要使用

中的局部变量lx, ly
    float lx = x[i] - xcenter;
    float ly = y[i] - ycenter;
    x[i] = xcenter + (float)(cos * lx - sin * ly);
    y[i] = ycenter + (float)(sin * lx + cos * ly);

如果对象已经以rotation的角度旋转,则此代码会将角度angle添加到总旋转角度。相反,如果给定的参数angle是新的总旋转角度,则需要使用角度差来计算sincos值。也就是说,例如,使用

启动该过程
public void rotate(float angle){


    double cos = Math.cos(angle - rotation);
    double sin = Math.sin(angle - rotation);

    this.rotation = angle;