我正在尝试做一个函数,它需要一个圆圈列表,并且只返回一个完全重叠的圆圈列表(一个在另一个里面)。问题在于该算法至少为O(n²),这是由于 getConcentricCircles 函数中的嵌套 for 以及大型数据集需要很长时间。有什么办法可以优化吗?
编辑:我不知道这是否有帮助,但我使用该算法来检测虹膜和瞳孔检测中的误报。如果一个圆圈完全在另一个圆圈内,那很可能是瞳孔,而外面是虹膜。它们应该是同心的,这会简化很多,但是人眼中的瞳孔恰好不在虹膜的中心,这就是我这样做的原因。
编辑 2:我已经用 Peter Lawrey 的解决方案替换了 isCircleInCircle,我的在某些情况下不正确
检查圆是否在圆内的函数:
private static boolean isCircleInCircle(Circle a, Circle b) {
// the circle is inside if the distance between the centre is less than the difference in the radius
double dx = a.getX() - b.getX();
double dy = a.getY() - b.getY();
double radiusDifference = a.getRadius() - b.getRadius();
double centreDistanceSquared = dx*dx + dy*dy; // edited
return radiusDifference * radiusDifference > centreDistanceSquared;
}
然后我检查列表中的每个元素,并只保存重叠的圆圈(和重叠的圆圈):
public HashSet<Circle> getConcentricCircles(List<Circle> circleList) {
HashSet<Circle> toReturn = new HashSet<Circle>();
for (Circle circle : circleList) {
for (Circle toCheck : circleList) {
// if the circles are not the same and one is inside another,
if (!toCheck.equals(circle) && isCircleInCircle(circle, toCheck)) {
// add both to the hashset
toReturn.add(circle);
toReturn.add(toCheck);
}
}
}
return toReturn;
}