Обнаружить прямоугольник, пересекающий круг

Обнаружить прямоугольник, пересекающий круг

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

В компьютерной графике и играх используется довольно простой трюк: увеличьте прямоугольник до радиуса круга, а затем вы можете просто проверить, находится ли центральная точка круга внутри или нет. (Последнее является проверкой диапазона центров x и y относительно rect [xmin, xmax] и [ymin, ymax].)

Scheff's Cat 19.12.2018 09:15

Если хотите узнать больше, попробуйте Google "пересечение прямоугольника круга".

Scheff's Cat 19.12.2018 09:18

Выровнен ли прямоугольник по оси или нет?

HolyBlackCat 19.12.2018 09:20

@Scheff Это не работает должным образом: представьте себе квадрат (-1-1) (- 1,1) (1,1) (1, -1) и круг с радиусом 1 и центром * (. 9, 1,9)

MBo 19.12.2018 09:22

Вам следует переформулировать вашу задачу на «пересечение сегмента круга» (круг против 4 сегментов прямоугольника). Ответ - здесь. Случай внутри / снаружи следует рассматривать отдельно.

tunglt 19.12.2018 09:27

@MBo Забыл, что выровненные по оси -> координаты центра должны быть преобразованы в выровненную по оси систему координат прямоугольника, если необходимо. Забыл также упомянуть «угловые» корпуса. В CG такая вещь используется для проверки границ, и угловые случаи часто допускаются, потому что они могут давать ложные срабатывания, которые не имеют отрицательного влияния, чем, возможно, потраченная впустую производительность ... К моему счастью, я предоставил эту ссылку с гораздо большим количеством рекомендаций . ;-)

Scheff's Cat 19.12.2018 09:28

если расстояние каждого угла прямоугольника до центра круга равно радиусу круга <=, то прямоугольник не пересекается.

Reblochon Masque 19.12.2018 09:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
176
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

 dx = Max(Abs(cx - rect.center.x) - rect.width / 2, 0)
 dy = Max(Abs(cy - rect.center.y) - rect.height / 2, 0)
 SquaredDistance = dx * dx + dy * dy

Затем сравните его с квадратом радиуса

Прямоугольник имеет 4 угла, вы должны проверить, не выходит ли ни один из этих 4 углов вне круга. Если у вас есть центр круга и его радиус, расстояние от углов каждого прямоугольника до центра круга должно быть меньше радиуса круга.

Не работает для квадрата (-1-1) (- 1,1) (1,1) (1, -1) и круга с центром (0,0) и радиусом 1,2 - все углы находятся снаружи, но пересечение существует.

MBo 19.12.2018 09:53

@MBo Question хочет убедиться, что прямоугольник находится внутри круга, поэтому не имеет значения, находится ли прямоугольник снаружи или пересекает его.

Nima 19.12.2018 10:17
Ответ принят как подходящий

Не совсем понял ваш вопрос, отвечу на два возможных вопроса:

1) Чтобы проверить, пересекается ли прямоугольник с кругом: сначала вы находите ближайшую точку прямоугольника к центру круга, а затем проверяете, находится ли эта точка в пределах радиуса круга от центра. Такие методы, как «проверять только углы» или «проверять сегменты прямоугольника», не работают и содержат контрпримеры.

Вот пример кода:

struct Rect
{
    double minX, maxX;
    double minY, maxY;
};

struct Circle
{
    double cX, cY, Radius;
};

double Clamp(double val, double lo, double hi) // use std::clamp if you have C++17
{
    if (val < lo) return lo;
    if (val > hi) return hi;
    return val;
}

double Sqr(double val) {return val*val;}

bool RectangleIntersectsCircle(Rect R, Circle C)
{
    double closestX = Clamp(C.cX, R.minX, R.maxX);
    double closestY = Clamp(C.cY, R.minY, R.maxY);

    return Sqr(closestX - C.cX) + Sqr(closestY - C.cY) < Sqr(C.Radius);
}

2) Чтобы проверить, полностью ли прямоугольник находится внутри круга: просто проверьте, все ли 4 угла прямоугольника находятся внутри круга.

bool RectangleInsideCircle(Rect R, Circle C)
{
    double fartherstX = max(fabs(R.minX - C.cX), fabs(R.maxX - C.cX));
    double fartherstY = max(fabs(R.minY - C.cY), fabs(R.maxY - C.cY));

    return Sqr(fartherstX) + Sqr(fartherstY) < Sqr(C.Radius);
}

Другие вопросы по теме