旋转矩形上的碰撞检测角度错误

时间:2019-01-20 15:40:57

标签: android collision-detection angle rectangles

我正在尝试使用以下代码片段使球与旋转的矩形碰撞:

for(int i = 0; i < barriers.length; i++) {

            Vector2d tempPos = rotate(pos.getX(), 
                                      pos.getY(), 
                                      barriers[i].getAngle(), 
                                      barriers[i].getCenterX(), 
                                      barriers[i].getCenterY());

            if (
                    tempPos.getX() > barriers[i].getBarrier().left &&
                    tempPos.getY() > barriers[i].getBarrier().top &&
                    tempPos.getX() < barriers[i].getBarrier().right &&
                    tempPos.getY() < barriers[i].getBarrier().bottom  )

            {
                dead = true;
            }

        }
    }
}

Vector2d rotate(float x1, float y1, float angle, float x2, float y2)
{
    sinus   = (float)Math.sin(angle);
    cosinus = (float)Math.cos(angle);

    float tempX = x2 - x1;
    float tempY = y2 - y1;
    x1 += ((tempX * cosinus) - (tempY * sinus));
    y1 += ((tempX * sinus)   + (tempY * cosinus));
    Vector2d point  =  new Vector2d(x1, y1);

    return point;
}

由于某种原因,即使数学应该是正确的,碰撞也会以稍微错误的角度发生。

在这里,我将角度设置为45度: Rectangles and collision set to 45 degrees

此处设置为90度:Rectangles and collision set to 90 degrees

在90度的图片中,角度更大了,看起来碰撞盒比应该的要小。

该角度取自Barrier类,该类保存每个矩形的Rect及其角度。与使用canvas.save-> rotate-> draw-> restore绘制矩形时使用的角度相同。

Vector2d类仅包含两个浮点数x和y,而pos则保留球的x和y。球没有碰撞盒,只有它的位置。

编辑:代码段中的角度以度为单位,但是即使使用Math.toRadians()将其设置为弧度,我也会遇到同样的问题。

Collision angle set to Math.toRadians(45)

1 个答案:

答案 0 :(得分:0)

好吧,所以在玩了一会之后,我设法解决了它。这是我更改的代码:

Vector2d rotate(float x1, float y1, float angle, float x2, float y2)
    {
        sinus   = (float)Math.sin(Math.toRadians(360 - angle));
        cosinus = (float)Math.cos(Math.toRadians(360 - angle));

        float tempX = x2 - x1;
        float tempY = y2 - y1;
        x2 += ((tempX * cosinus) - (tempY * sinus));
        y2 += ((tempX * sinus)   + (tempY * cosinus));
        Vector2d point  =  new Vector2d(x2, y2);

        return point;
    }

似乎我必须得到反角,并将数学应用于矩形的x和y而不是点的。然后,我返回新的x和y进行碰撞检查...我很困惑,但是可以!