检测矩形交叉圆

时间:2018-12-19 07:56:42

标签: graphics geometry language-agnostic detection

**enter image description here**

如何检测矩形是从圆中出来还是穿过圆了?矩形是一个自由流动的内圆。我知道圆的确切位置和矩形的确切位置。

3 个答案:

答案 0 :(得分:4)

从圆心到矩形最近点的平方距离可以计算为(零表示圆心在矩形内):

 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

然后将其与半径平方进行比较

答案 1 :(得分:2)

该矩形有4个角,您应该检查这4个角中是否没有一个不在圆外。 如果您有圆心及其半径,则每个矩形角到圆心的距离必须小于圆半径。

enter image description here

答案 2 :(得分:1)

我还不太了解您的问题,我将回答两个可能的问题:

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);
}