Обнаружение столкновения на повернутом прямоугольнике имеет неправильный угол - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь заставить шары сталкиваться с повернутыми прямоугольниками, используя этот фрагмент кода:

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 градусов: Прямоугольники и столкновения установлены на 45 градусов

И здесь он установлен на 90 градусов: Прямоугольники и столкновения установлены на 90 градусов

На 90-градусном изображении угол еще больше отклонен, и похоже, что поле столкновения меньше, чем должно.

Угол берется из класса Barrier, который содержит Rect для каждого прямоугольника, а также его угол. Это тот же угол, который используется при рисовании прямоугольников с помощью canvas.save-> rotate-> draw-> restore.

Класс Vector2d просто содержит два числа с плавающей точкой, x и y, а pos содержит x и y для мяча. Мяч не имеет ящика для столкновений, только его позиция.

Редактировать : угол в моем фрагменте кода указан в градусах, но даже если я установлю его в радианах с помощью Math.toRadians (), у меня возникнет та же проблема.

Угол столкновения установлен в Math.toRadians (45)

1 Ответ

0 голосов
/ 20 января 2019

Хорошо, так что немного поиграв с этим, мне удалось решить его.Вот мой измененный код:

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 для проверки на столкновение ... Я сбит с толку, но это работает!

...