Предположительно, он не работает для углов, потому что когда мяч попадает в угол, он одновременно ударяет в две стороны. И если вы хотите, чтобы он отскочил точно, соответствующий нормальный вектор - это вектор от центра шара к углу, который будет иметь некоторую диагональ между горизонталью и вертикалью.
Предполагая, что вы всегда обнаруживаете перекрытие, когда центр шара находится за пределами прямоугольника, вы, вероятно, захотите сделать что-то вроде:
// 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
}
}
Лучшим тестом - для обработки как внутренних, так и внешних столкновений - было бы найти расстояние до ближайшей точки с каждой стороны, выбрать наименьшее расстояние, затем, если ближайшая точка является углом, то это угловое столкновение, в противном случае это сторона столкновение.