Формула столкновения окружностей - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть эта формула для простого обнаружения столкновения круга:

private bool CircleCollision(Rectangle Circle1, Rectangle Circle2)
{
    int X1 = Circle1.Left;
    int Y1 = Circle1.Top;
    int X2 = Circle2.Left;
    int Y2 = Circle2.Top;

    int R1 = Circle1.Width / 2;
    int R2 = Circle2.Width / 2;
    int Radius = R1 + R2;

    int dX = X2 - X1;
    int dY = Y2 - Y1;

    if (Math.Sqrt((dX * dX) + (dY * dY)) <= Math.Sqrt(Radius * Radius)) 
        return true; 
    else 
        return false;
}

Но это просто обнаружение, когда два круга имеют одинаковый радиус. Что я делаю не так?

решаемые

int X1 = Circle1.Left + (Circle1.Width / 2);
int Y1 = Circle1.Top + (Circle1.Height / 2);
int X2 = Circle2.Left + (Circle2.Width / 2);
int Y2 = Circle2.Top + (Circle2.Height / 2);

1 Ответ

2 голосов
/ 15 декабря 2011

Чтобы проверить, перекрываются ли два круга, вы можете сделать:

var radius=circle1.Radius+circle2.Radius;
var deltaX=circle1.CenterX-circle2.CenterX;
var deltaY=circle1.CenterY-circle2.CenterY;
return deltaX*deltaX + deltaY*deltaY <= radius*radius;

Обратите внимание, что я вычисляю расстояние между центрами, а не верхними левыми углами.Я также сравниваю с квадратом радиуса, поэтому мне не нужно использовать дорогую функцию Math.Sqrt, но это не влияет на правильность.

Ваш код не работает, потому что вы используете Leftи Top вместо положения центра.Разница между верхними левыми углами такая же, как разница между центрами, если радиус одинаков.Это объясняет, почему ваш код работает только в этом особом случае.

Не уверен, почему вы используете прямоугольник для представления круга.Вы можете рассчитать центр как centerX = 0.5*(Left+Right).Вы также должны добавить проверку, что Width==Height, иначе вы можете получить эллипс в качестве параметра, и тогда этот алгоритм не будет работать.

...