在一组圆圈中找到完全覆盖的圆圈

Posted

技术标签:

【中文标题】在一组圆圈中找到完全覆盖的圆圈【英文标题】:Find totally covered circles in a set of circles 【发布时间】:2016-05-26 20:31:04 【问题描述】:

我们在一个矩形区域有一组圆,所有的圆都有相同的半径,我想找到完全被其他圆覆盖的圆。 有什么算法吗?

【问题讨论】:

看这篇文章(可能有帮助):math.stackexchange.com/questions/68395/… 【参考方案1】:

几何

首先,找出所有圆心距离主圆心2×r以内的圆;更远的圆圈不重叠。

示例:主(黑色)圆圈和 3 个重叠的圆圈。

然后,要知道主圆被完全覆盖,您必须找到一组圆,其中位于主(黑色)圆内的两个圆的每个交点都被第三个圆覆盖。

算法

实际上,您从 2 个圆圈(例如蓝色和红色)开始,然后找到它们相交的 2 个点(紫色点)。如果一个或两个点都在主(黑色)圆圈内,那么这些点必须被另一个圆圈覆盖。

然后,一个接一个地添加一个额外的圆圈(例如绿色),并查看它是否覆盖了未覆盖的点(在示例中是这样)。但是,这个新圆添加了与集合中已经存在的其他圆(蓝色和红色)的新交点;找到这些点(蓝绿色和棕色点)并检查它们是否被任何一个圆圈覆盖(蓝绿色的被红色圆圈覆盖,但棕色的未被蓝色圆圈覆盖)。

继续向集合中添加圆圈,直到主(黑色)圆圈内的每个交点都被集合中的另一个圆圈覆盖(在这种情况下,整个主圆圈都被覆盖),或者直到你用完圆圈(其中如果主圈没有被完全覆盖)。

特殊情况: 如果其中一个圆的中心点与主圆完全相同,则它会自行覆盖主圆。 如果没有一个圆在主圆内有交点,则不覆盖主圆。

代码示例

这个代码示例演示了如何找到两个圆的交点,它处理了算法中所需的大部分几何图形。

function intersections(p, q, r) 
    var d = distance(p, q);
    if (d > 2 * r) return [];
    var m = middle(p, q);
    if (d == 2 * r) return [m];
    var a = angle(p, q) + Math.PI / 2;
    var l = length(d, r);
    return [x: m.x + l * Math.cos(a), y: m.y + l * Math.sin(a),
            x: m.x - l * Math.cos(a), y: m.y - l * Math.sin(a)];

    function distance(p, q) 
        return Math.sqrt(Math.pow(p.x - q.x, 2) + Math.pow(p.y - q.y, 2));
    
    function middle(p, q) 
        return x: (p.x + q.x) / 2, y: (p.y + q.y) / 2;
    
    function angle(p, q) 
        return Math.atan2(q.y - p.y, q.x - p.x);
    
    function length(d, r) 
        return Math.sqrt(Math.pow(r, 2) - Math.pow(d, 2) / 4);
    


document.write(JSON.stringify(intersections(x:1, y:2, x:3, y:-4, 5)));

【讨论】:

@lola 与往常一样比较距离时,比较距离的平方将消除计算(耗时)平方根的需要。

以上是关于在一组圆圈中找到完全覆盖的圆圈的主要内容,如果未能解决你的问题,请参考以下文章

通过在 imageview 中绘制圆圈裁剪图像

有没有办法让半透明的圆圈背景完全透明,中间是完全不透明的盒子?

如何用最少 30 英里半径的圆圈覆盖美国地图?

在圆圈OpenCV中绘制文本

使用OpenGL在圆圈中移动对象?

Raphael js 文本定位:将文本居中在一个圆圈中