算法以准确检测正方形和圆之间的重叠

Algorithm for accurate detection of overlap between a square and a circle?

本文关键字:之间 重叠 正方形 检测 算法      更新时间:2023-10-16

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接近,则有一个重叠。