i正在实现(在C 中)一种检测何时在2D平面上两个静态的,轴对齐的形状之间发生重叠的方法。形状是正方形或圆形,因此我需要考虑三种重叠的情况:正方形,圆圈和圆方方。
正方形和圆圈很简单,但是我努力在网上找到有关正确算法的任何可靠信息,用于计算方形圆形重叠。
我知道我可以将正方形嵌入一个粗糙的方法中(反之亦然),但是我对被认为是更精确的最清洁方法感兴趣?
在线研究它表明这个问题有一个"正确"的答案,但尚不清楚该答案到底是什么。
这是一种简单快速的算法:
bool doesSquareCircleOverlap(float squareCenterX, float squareCenterY, float squareHalfSize, float circleCenterX, float circleCenterY, float circleRadius) {
float x = fabs(circleCenterX - squareCenterX) - squareHalfSize;
float y = fabs(circleCenterY - squareCenterY) - squareHalfSize;
if (x>0) {
if (y>0) {
return x*x + y*y<circleRadius*circleRadius;
} else {
return x<circleRadius;
}
} else {
return y<circleRadius;
}
}
请注意,正方形由中心表示,。
基本上,它的作用是:
- 它使用
fabs()
去除对称案例 - 将角落放入原点
- 检查圆的中心是哪个区域,以确定从圆的正方形上的最接近点。如果关闭点比
circleRadius
接近,则有一个重叠。