Как определить, что прямоугольник выходит из круга или пересекает его? Прямоугольник - это свободный внутренний круг. Я знаю точное положение круга и точное положение прямоугольника.
Если хотите узнать больше, попробуйте Google "пересечение прямоугольника круга".
Выровнен ли прямоугольник по оси или нет?
@Scheff Это не работает должным образом: представьте себе квадрат (-1-1) (- 1,1) (1,1) (1, -1) и круг с радиусом 1 и центром * (. 9, 1,9)
Вам следует переформулировать вашу задачу на «пересечение сегмента круга» (круг против 4 сегментов прямоугольника). Ответ - здесь. Случай внутри / снаружи следует рассматривать отдельно.
@MBo Забыл, что выровненные по оси -> координаты центра должны быть преобразованы в выровненную по оси систему координат прямоугольника, если необходимо. Забыл также упомянуть «угловые» корпуса. В CG такая вещь используется для проверки границ, и угловые случаи часто допускаются, потому что они могут давать ложные срабатывания, которые не имеют отрицательного влияния, чем, возможно, потраченная впустую производительность ... К моему счастью, я предоставил эту ссылку с гораздо большим количеством рекомендаций . ;-)
если расстояние каждого угла прямоугольника до центра круга равно радиусу круга <=, то прямоугольник не пересекается.





Квадратное расстояние от центра круга до ближайшей точки прямоугольника можно рассчитать как (ноль означает, что центр круга находится внутри прямоугольника):
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 Question хочет убедиться, что прямоугольник находится внутри круга, поэтому не имеет значения, находится ли прямоугольник снаружи или пересекает его.
Не совсем понял ваш вопрос, отвечу на два возможных вопроса:
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);
}
В компьютерной графике и играх используется довольно простой трюк: увеличьте прямоугольник до радиуса круга, а затем вы можете просто проверить, находится ли центральная точка круга внутри или нет. (Последнее является проверкой диапазона центров x и y относительно rect [xmin, xmax] и [ymin, ymax].)