Я пытаюсь заставить шары сталкиваться с повернутыми прямоугольниками, используя этот фрагмент кода:
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)