2012-02-17 2 views
0

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

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

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

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

// 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 
    } 
} 

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

+0

Ваш последний комментарий о поиске ближайшей точки - это то, как я в настоящее время выполняю свое первоначальное обнаружение столкновения. Мне нравится ваша идея о тестировании, если ближайшая точка - это угол. Предполагая, что это угол, есть ли у вас какие-либо идеи, как я буду определять, на какой стороне он основан? Предполагая, что это не идет прямо к углу. Спасибо за ваш ответ, кстати! – DRiFTy

+0

Нет встроенной стороны, если она попадает в угол, потому что углы принадлежат двум сторонам. Однако, если вам нужно выбрать один из них, то, предположив, что вы попали в верхний правый угол, вы, вероятно, выберете верхний край, если вектор от угла до центра сферы ближе к вертикали, правый край, если он будет ближе к горизонтали (так это сравнение по абсолютным значениям координат x и y) и либо без предпочтений, если ровно 45 градусов. – Tommy

+0

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