参考:知乎高赞回答:怎样判断平面上一个矩形和一个圆形是否有重叠?
第一步:将矩形的中心平移至坐标轴圆心处,同时圆也要同步变换。
第二步:将圆变换置第一象限
第三步:计算
u
⃗
\vec u
u,
u
⃗
=
v
⃗
−
h
⃗
\vec u = \vec v -\vec h
u=v−h;注:
v
⃗
\vec v
v表示由变换之后的矩形中心指向变换之后圆心的向量,
h
⃗
\vec h
h表示由变换之后的矩形中心指向矩形右上端点的向量。
第四步:不妨假设
u
⃗
=
(
x
,
y
)
\vec u=(x,y)
u=(x,y) 将x,y中小于0的坐标都置为0,如第二幅图所示;
第五步:如果
∣
u
⃗
∣
≤
r
a
d
i
u
s
|\vec u| \leq radius
∣u∣≤radius 则说明有重叠,否则没有。
代码实现
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)表示矩形的左下端点的坐标,
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2)表示是右上角的坐标。
bool checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
int tx = (x1+x2)/2, ty = (y1+y2)/2; // (tx,ty)表示未变换之前的矩形中心
int tdx = -tx, tdy = -ty; // (tdx,tdy)表示变换之后的矩形中心
// (x11,y11),(x21,y21)表示矩形的左下和右上端点
int x11 = x1+tdx,x21 = x2 + tdx, y11 = y1+tdy, y21 = y2+tdy;
// (xc,yc)表示变换到第一象限的圆心坐标
int xc = abs(x_center+tdx), yc = abs(y_center+tdy);
// (ux,uy)表示u向量
int ux = xc-x21, uy = yc-y21;
// 将u向量中的x,y小于0的置为0
ux = max(0,ux), uy = max(0,uy);
// 判断
return ux*ux+uy*uy <= radius*radius;
}
注:使用图片均来自 知乎高赞回答:怎样判断平面上一个矩形和一个圆形是否有重叠?