2012-06-08 3 views
1

Как я могу определить, касается ли окружность внешнего прямоугольника или находится (частично) вне прямоугольника в двумерном евклидовом пространстве?Обнаружение столкновений границы круга-прямоугольника

Прямоугольник всегда будет выровнен с осями. Visual representation of a circle-rectangle's border collision

В основном я создаю простую игру с шаром, который движется определенными шагами с определенным углом в пространстве.

+0

возможно дубликат [Расчет столкновения для движущегося круга, без перекрытия границ] (HTTP: // StackOverflow .com/questions/2751377/calculating-collision-for-a-moving-circle-without-overlapping-the-limits) – finnw

ответ

3

Обозначим четыре стороны прямоугольника s1, s2, s3, s4, начиная сверху и двигаясь по часовой стрелке.

Проверьте расстояние от центра круга до каждой из четырех линий; d1, d2, d3, d4 (пронумеровано по бокам). Обратите внимание, что существует простая формула для вывода (ортогонального) расстояния от точки до линии.

Необходимые (хотя и не достаточное) условие является то, что расстояние от одной из линий является длиной радиуса (прагматично разница меньше, чем какая-то дельта по вашему выбору):
|d1 - r| < delta || ...

Вы можете сделать это достаточное условие, если круг полностью внутри прямоугольник, который является истинным тогда и только тогда каждым расстояние меньше, чем расстояние между соответствующими сторонами прямоугольника, меньше радиуса:
d1 <= |s1 - s3|-r && d2 <= |s2 - s4|-r && ...

проверкой частично снаружи так же просто, как проверка для напротив последнего абзаца (и если требуется, проверить, что радиус еще в коробке):
d1 > |s1 - s3|-r || d2 > |s2 - s4|-r || ...

+0

Спасибо за ваш ответ, но я сожалею, что забыл сказать, что мой круг движется в определенные шаги, поэтому есть шанс (в зависимости от разрешения экрана пользователя, ...), чтобы круг никогда не касался прямоугольника. – ComFreek

+0

@ComFreek, вы берете математическую модель и интерполируете свое движение двумя способами: (1) создайте дельта-значение, которое достаточно велико, но не слишком велико (2) разделите ваше движение: возьмите две точки, и хотя они два смежных кадры анимации, вычислить некоторое количество промежуточных кадров, скажем 50, и на каждом из них выполнить вычисления. – davin

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