2015-02-28 5 views
0

Итак, я создал метод, который обнаруживает столкновение шара BallView с прямоугольным прямоугольником. Я разбил его на 4 части; он обнаруживает столкновение между самой вершиной круга, очень слева от круга, самой нижней частью круга и самой правой частью круга, и прямоугольником. Две из тех работ, которые обнаруживают столкновение между левой точкой на круге и прямоугольником и обнаруживают столкновение между правой точкой на круге и прямоугольником. Но, что не будет работать, если самая верхняя точка или самая нижняя точка касаются прямоугольника, коллизия не обнаружена, как я могу видеть, когда я записываю оператор if, чтобы узнать, введен ли он. Вот мой код (метод .getR() получает радиус окружности):Обнаружение столкновений точек и прямоугольников?

public boolean intersects(BallView ball, Rectangle rect){ 
    boolean intersects = false; 

    //Left point 
    if (ball.getX() - ball.getR() >= rect.getTheLeft() && 
     ball.getX() - ball.getR()<= rect.getTheRight() && 
     ball.getY() <= rect.getTheBottom() && 
     ball.getY() >= rect.getTheTop()) 
    { 
     intersects = true; 
    } 

    //Right point 
    if (ball.getX() + ball.getR() >= rect.getTheLeft() && 
     ball.getX() + ball.getR() <= rect.getTheRight() && 
     ball.getY() <= rect.getTheBottom() && 
     ball.getY() >= rect.getTheTop()) 
    { 
     intersects = true; 
    } 

    //Bottom point (wont work?) 
    if (ball.getX() >= rect.getTheLeft() && 
     ball.getX() <= rect.getTheRight() && 
     ball.getY() + ball.getR() <= rect.getTheBottom() && 
     ball.getY() + ball.getR()>= rect.getTheTop()) 
    { 
     intersects = true; 
    } 

    //Top point (wont work?) 
    if (ball.getX() >= rect.getTheLeft() && 
     ball.getX() <= rect.getTheRight() && 
     ball.getY() - ball.getR()<= rect.getTheBottom() && 
     ball.getY() - ball.getR()>= rect.getTheTop()) 
    { 
     intersects = true; 
    } 

    return intersects; 

} 

я принял во внимание, что Y возрастает по мере перехода вниз и X увеличивается, как вы идете прямо. Почему этот метод не обнаруживает пересечение верхней и нижней точек на краю круга? Кроме того, экран ориентирован на ландшафт.

ответ

0

Похоже, что это всего лишь логическая ошибка. Я предполагаю, что .getX и .getY - это координаты x и y центра шара, а .getR - радиус, поэтому вы хотите, чтобы ваш код выглядеть как этот

if (ball.getX() + ball.getR() >= rect.getTheLeft() && 
    ball.getX() - ball.getR() <= rect.getTheRight() && 
    ball.getY() - ball.getR() <= rect.getTheBottom() && 
    ball.getY() + ball.getR() >= rect.getTheTop()) 
{ 
    intersects = true; 
} 

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

+0

благодарственное вы теперь отлично работаете, но мне пришлось внести два изменения: 'ball.getY() + ball.getR() <= rect.getTheBottom()' и 'ball.getY() + ball.getR()> = rect .getTheTop() 'Thnak you! –

+0

Рад, что вы его работаете, логике всегда интересно попробовать и отладить – Vorzak3

Смежные вопросы