Круг и Прямоугольник Столкновение Android - PullRequest
0 голосов
/ 17 февраля 2012

У меня на экране отскакивает мяч, и есть статический прямоугольник, с которым он может столкнуться и должен отскочить от него.Я уже выяснил, как проверить, столкнулся ли шар с прямоугольником, и это прекрасно работает.Теперь мне нужно определить, на какую сторону прямоугольника попал мяч.В настоящее время я пытаюсь этот код (который работает для тестирования четырех сторон, но, кажется, есть проблемы с углами) ...

if(Math.abs(ball.centerY-boundingBox.top) < ball.radius) {
    // Hit the top

}
else if(Math.abs(ball.centerY-boundingBox.bottom) < ball.radius) {
    // Hit the bottom

}
else if(Math.abs(ball.centerX-boundingBox.left) < ball.radius) {
    // Hit the left

}
else if(Math.abs(ball.centerX-boundingBox.right) < ball.radius) {
    // Hit the right

}

... У кого-нибудь есть идеи, как я могу улучшить это?Или придумать лучшее решение по этому вопросу?

Мне просто нужно определить, с какой стороны круг попал в прямоугольник после их столкновения.И я уже понял, как проверить, сталкиваются ли они или нет.

Спасибо!

1 Ответ

1 голос
/ 17 февраля 2012

Предположительно, он не работает для углов, потому что когда мяч попадает в угол, он одновременно ударяет в две стороны. И если вы хотите, чтобы он отскочил точно, соответствующий нормальный вектор - это вектор от центра шара к углу, который будет иметь некоторую диагональ между горизонталью и вертикалью.

Предполагая, что вы всегда обнаруживаете перекрытие, когда центр шара находится за пределами прямоугольника, вы, вероятно, захотите сделать что-то вроде:

// is the ball above the box?
if(Math.abs(ball.ballCenterY-boundingBox.top) < ball.radius)
{
    if(ball.ballCentreX >= boundingBox.left)
    {
         if(ball.ballCentreY <= boundingBox.right)
         {
             // ball hit the top edge
         }
         else
         {
             // ball hit the top right corner
         }
    }
    else
    {
        // hit top left corner
    }
}

Лучшим тестом - для обработки как внутренних, так и внешних столкновений - было бы найти расстояние до ближайшей точки с каждой стороны, выбрать наименьшее расстояние, затем, если ближайшая точка является углом, то это угловое столкновение, в противном случае это сторона столкновение.

...