在Java中查找重叠的圆圈

时间:2017-07-10 18:08:17

标签: java geometry overlapping points

是否有一种简单的方法可以在Java中找到重叠的圆圈(每个圆圈中间有一个点,半径相同)?

例如,如果我有一个数据集并且我有这些点

Point1 (3|3)
Point2 (4|2)
r = 1

所以我会这样:

Overlapping Points

如何检查Java,这两点是否重叠?

最好,并提前感谢你!

3 个答案:

答案 0 :(得分:4)

如果中心之间的距离小于半径之和,则圆圈重叠:

public static boolean checkOverlap(Circle c1, Circle c2) {
    return Math.hypot(c1.x - c2.x, c1.y - c2.y) < c1.r + c2.r;
}

如果您有多个圈子并且正在寻找成对重叠,那么您可以使用k-d tree比O(n 2 )更好。

答案 1 :(得分:2)

这实际上只是应用毕达哥拉斯定理的问题。

boolean areCirclesOverlappint(Point a, Point b, double radius) {
    double diffX = a.x - b.x;
    double diffY = a.y - b.y;
    return diffX * diffX + diffY * diffy <= radius * radius * 4;
}

答案 2 :(得分:2)

一个简单的启发式。 (这只是arshajii答案的补充。)

如果要避开k-D树,可以在X坐标上对中心进行排序。然后依次考虑所有圆圈,并检查仅与[X,X + 2R]中具有中心横坐标的圆重叠。

假设N个圆均匀分布在相对大小为M(直径大于边界)的域中,则只能进行N²/ 2比较以获得最大值(N²/ M,N)。