Определить прямоугольник пересечения круга - PullRequest
0 голосов
/ 19 декабря 2018

**enter image description here**

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

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

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

enter image description here

0 голосов
/ 19 декабря 2018

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

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);
}
0 голосов
/ 19 декабря 2018

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

 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

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

...