ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-14 20:35:49  阅读:205  来源: 互联网

标签:circleCenter rectangleCenter 重叠 width 圆形 圆心 offset 矩形


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

此处讨论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

标签:circleCenter,rectangleCenter,重叠,width,圆形,圆心,offset,矩形
来源: https://www.cnblogs.com/shadow-lr/p/14769761.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有