如何获得圆的下限和上限半径?

时间:2016-04-29 23:03:01

标签: algorithm math trigonometry

问题和附近的解​​决方案图片:

问题:与每个节点距离相等的网格。网格的每个小节点都是半径为r的圆(图:灰色圆圈),如果我们制作任何圆(图:蓝色)那么我们如何制作一组具有上部(图:红色圆圈)和下限的圆圈(图:红色圆圈)。基本上我们需要找到上限半径和下限半径。

已知价值是:

  1. 小圆半径(灰色)r。
  2. 从中心到中心的两个灰色圆圈/ node_of_grid之间的距离= 4 X r。
  3. 大圆半径(蓝色)rb。 //这可能会有所不同,但会是r的倍数。在该图中,情况是直径d = 2(20×r)。
  4. 大圆圈中心只能是小圆圈的中心。
  5. 如何找到上圆和下圆的半径。在大圆周内的每个蓝色小圆圈都应该位于下限之下,反之亦然。[/ p>

    目前我想出了这个不正确的解决方案: unpper_bound_radius = rb +(r +(rb /(3.1415926 * 2r))) lower_bound_radius = rb - (r +(rb /(3.1415926 * 2r)))

    由于

1 个答案:

答案 0 :(得分:3)

如果您正在寻找一种算法来确定哪些灰点与蓝色圆圈相交,并计算包含所选灰色点的边界的半径,您可以执行以下操作:

  • 给内外边界一个等于蓝色圆的半径。
  • 中心正上方的灰点与蓝色圆圈相交或正好位于其上方,是起点。
  • 计算从该点到中心点的距离;如果它在rb-rrb+r之间,则蓝色圆圈与此灰色点相交。
  • 如果相交,请根据需要将内边界调整为distance - r,将外边界调整为distance + r
  • 如果没有,并且距离更远,请尝试下面的网格点;如果没有,并且距离较小,请尝试右侧的网格点。
  • 这样做直到你离开45°扇区;你只需要检查圆的一个八分之一,其他结果将是对称的。

enter image description here enter image description here

示例计算:

  • 第一个网格点位于顶部,距离中心5×4r;边界为5×4r-r和5×4r + r。
  • 右边的下一个网格点距离中心5.09902×4r,因此外边界增加到5.09902×4r + r。
  • 右边的下一个网格点位于距中心5.38516×4r处,蓝色圆圈外面的距离为1.54066×r(太远)。
  • 下一个网格点向下距中心4.47216×4r,蓝圈内距离1.88854×r(太近)。
  • 右边的下一个网格点距离中心正好是5×4r,因此边界不会改变。
  • 右边的下一个网格点位于距离中心5.65686×4r处,在蓝色圆圈外面是2.62742×r(太远)。
  • 下一个网格点向下超过45°。

结果:内边界为5×4r-r,外边界为5.09902×4r + r。

function boundaries(b) {
    var i = b, o = b, x = 0, y = Math.ceil(b / 4) * 4;
    while (Math.atan2(y, x) >= Math.PI / 4) {
        var d = Math.sqrt(x * x + y * y);
        if (d < b - 1) x += 4;           // too close, go right
        else if (d > b + 1) y -= 4;      // too far, go down
        else {                           // intersection
            if (i > d - 1) i = d - 1;    // adjust inner
            if (o < d + 1) o = d + 1;    // adjust outer
            x += 4;                      // go right
        }
    }
    return {i: i, o: o};
}

var res = boundaries(20);
document.write("inner: r&times;" + res.i + "<br>outer: r&times;" + res.o);