怎样判断平面上一个矩形和一个圆形是否有重叠

Posted shadow_lr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样判断平面上一个矩形和一个圆形是否有重叠相关的知识,希望对你有一定的参考价值。

怎样判断平面上一个矩形和一个圆形是否有重叠

此处讨论AABB(轴对齐矩形情况),如果是OBB(非轴对齐矩形),可将圆心随着矩形旋转成轴对齐再进行判断

设c为矩形中心,h为矩形半长,p为圆心,r为半径

9230a91992b72b999a0e4fe3bb2f9195_720w

核心思路

  • 主要的方法是计算圆心到矩形的最短距离u,然后判断距离u是否小于半径r,r小于等于半径r时则有重叠,否则没有重叠

  • 通过圆心和矩阵中心点计算向量BC,然后通过clamp将向量的横纵分量限制在矩形长宽范围内,然后就可以获得点p,然后判断点p与圆心间的距离即可

        // 计算圆心到矩形中心点的向量
        Vector2 offset = circleCenter - rectangleCenter;
        Debug.DrawLine(circleCenter, rectangleCenter, Color.red);
        
        // 将向量横纵分量,限制在行款范围内
        offset.x = Mathf.Clamp(offset.x, -length, length);
        offset.y = Mathf.Clamp(offset.y, -width, width);

        // 计算离圆心最近的点
        offset = rectangleCenter + offset;

a5aefbe4fdac68f6e3d3b3082595499a_720w

image-20210514192916352

代码

以下给出Unity中的实现代码和效果展示

    bool IsIntersect()
    {
        circleCenter = new Vector2(circle.transform.position.x, circle.transform.position.y);
        rectangleCenter = new Vector2(rectangle.transform.position.x, rectangle.transform.position.y);
        radius = circle.radius;
        
        length = rectangle.length * 0.5f;
        width = rectangle.width * 0.5f;

        // 计算圆心到矩形中心点的向量
        Vector2 offset = circleCenter - rectangleCenter;
        Debug.DrawLine(circleCenter, rectangleCenter, Color.red);
        
        // 将向量横纵分量,限制在行款范围内
        offset.x = Mathf.Clamp(offset.x, -length, length);
        offset.y = Mathf.Clamp(offset.y, -width, width);

        // 计算离圆心最近的点
        offset = rectangleCenter + offset;

        distance = (offset - circleCenter).magnitude;

        Debug.DrawLine(rectangleCenter, offset, Color.green);

        return distance <= radius;
    }

效果

2021-05-14-19-39-34

2021-05-14-19-39-42

以上是关于怎样判断平面上一个矩形和一个圆形是否有重叠的主要内容,如果未能解决你的问题,请参考以下文章

矩形重叠

圆形与矩形的碰撞检测--Mr.Ember

C++编程,求俩矩形重叠面积的代码

矩形重叠(矩形相交,dp)

矩形重叠判断

Overlapping rectangles判断两个矩形是否重叠的问题 C++