在一组圆圈中找到完全覆盖的圆圈
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 与往常一样比较距离时,比较距离的平方将消除计算(耗时)平方根的需要。以上是关于在一组圆圈中找到完全覆盖的圆圈的主要内容,如果未能解决你的问题,请参考以下文章