Круг и код пересечения прямоугольника не работает? - PullRequest
0 голосов
/ 09 июня 2019

Почему мой код не обнаруживает пересечение круга и прямоугольника?

public static boolean RectCircleColliding(Circle circle, Rectangle rect)
{  
    double distX = Math.abs(circle.getCenterX() - rect.getX() - rect.getWidth()/2);
    double distY = Math.abs(circle.getCenterY() - rect.getY() - rect.getHeight()/2); 

    if (distX > rect.getWidth()/2 + circle.getRadius())
        return false;
    if (distY > rect.getHeight()/2 + circle.getRadius())
        return false;

    if (distX <= rect.getWidth()/2)
        return true;
    if (distY <= rect.getHeight()/2) 
        return true;

    double dx = distX - rect.getWidth()/2;
    double dy = distY - rect.getHeight()/2; 

    return dx*dx + dy*dy <= (circle.getRadius()*circle.getRadius());
}    

Я использую следующие координаты окружности и прямоугольника:

Rectangle bounds = new Rectangle(7, 12, 2, 6);

Circle ball = new Circle(5, 7, 4.123);

1 Ответ

0 голосов
/ 10 июня 2019

Вы дважды работаете с «расстояниями» и допускаете ошибки.Условия могут быть упрощены (замените rect.center вашими данными):

dx = Max(Math.abs((circle.getCenterX() - rect.center.x) - rect.width / 2, 0);
dy = Max(Math.abs(circle.getCenterY() - rect.center.y) - rect.height / 2, 0);
return dx * dx + dy * dy <= (circle.getRadius()*circle.getRadius());
...