怎样判断平面上一个矩形和一个圆形是否有重叠
作者:互联网
怎样判断平面上一个矩形和一个圆形是否有重叠
此处讨论AABB(轴对齐矩形情况),如果是OBB(非轴对齐矩形),可将圆心随着矩形旋转成轴对齐再进行判断
设c为矩形中心,h为矩形半长,p为圆心,r为半径
核心思路
-
主要的方法是计算圆心到矩形的最短距离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;
代码
以下给出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;
}
效果
标签:circleCenter,rectangleCenter,重叠,width,圆形,圆心,offset,矩形 来源: https://www.cnblogs.com/shadow-lr/p/14769761.html