【问题标题】:Algorithm for accurate detection of overlap between a square and a circle? [duplicate]准确检测正方形和圆形重叠的算法? [复制]
【发布时间】:2018-05-18 06:36:54
【问题描述】:

我正在实现(在 C++ 中)一种方法来检测二维平面上的两个静态轴对齐形状之间何时发生重叠。形状是正方形或圆形,因此我需要考虑三种重叠情况:正方形-正方形、圆形-圆形和圆形-正方形。

方形和圆形足够简单,但我很难在网上找到任何关于计算方形重叠的正确算法的可靠信息。

我知道我可以将正方形嵌入圆内(反之亦然)作为一种粗略的方法,但我感兴趣的是什么被认为是更精确地做到这一点的最干净的方法?

在线研究表明这个问题有一个“正确”的答案,但不清楚这个答案到底是什么。

【问题讨论】:

  • 更一般地,找到矩形(正方形)上离圆心最近的点。如果形状是 AA,这是微不足道的。如果没有,点积会给出这个。如果这个距离小于圆的半径,就会发生碰撞。除非圆完全在正方形内,否则您需要检查每个点是否包含(每个顶点到中心的距离与半径的距离。)
  • 最干净的方法取决于为您的图形存储了哪些信息。你的圆是由 3 点的坐标建模的,还是你有中心和半径。对于您的矩形,同上 3 点,还是其他什么?如果你提供给我,我会很高兴回到高中数学!
  • 或者我只是给你一个提示:让AB 成为你的长方形l 的边的末端,让我们C 成为圆的中心。让我们dC 到线 (AB) 的距离,你有这个关系 abs(ABxAC)=l*d 其中x 是叉积 AB 和 AC 是向量。此外,产品的标志可以指示圆心是朝内还是朝外。

标签: c++ algorithm geometry collision-detection


【解决方案1】:

这是一个简单快速的算法:

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 更近,则存在重叠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多