我想分组/合并/联合矩形彼此接近(相似)。没有特别的理由为什么我递归地试了这个,但这似乎是合适的。
但是我在这里遗漏了一些东西。输出不正确,我没有考虑到以后合并的矩形可能现在已接近我考虑的矩形"不可合并"并加入finalList
合并和检查接近方法正常工作。
public static ArrayList<Rect> mergeCloseRects(ArrayList<Rect> sourceList, ArrayList<Rect> finalList) {
Rect rect = sourceList.get(0).clone();
sourceList.remove(0);
for (int i = 0; i < sourceList.size(); i++) {
if (rectsAreClose(rect, sourceList.get(i)) {
// put merged rectangle on top of the list
sourceList.add(0, getMergeRect(rect, sourceList.get(i)));
// remove rectangle that was merged with rect
sourceList.remove(i + 1);
mergeCloseRects(sourceList, finalList);
}
}
// if rect has no close neighbours
finalList.add(rect);
return finalList;
}
输入
输出
正如您所看到的,矩形并未真正合并。下面的矩形留在列表中。绿色轮廓表示新矩形的位置。
答案 0 :(得分:0)
在我看来,这比迭代更适合迭代:你可以自然地继续前进,直到没有任何东西可以合并。我认为您的代码应该类似于:
while(!getListCloseRectangles(sourceList).isEmpty()) {
List<Rect> rectanglesToMerge = getListCloseRectangles(sourceList);
sourceList.removeAll(rectanglesToMerge);
sourceList.add(createMergedRect(rectanglesToMerge));
}
这也允许getListCloseRectangles一次返回两个以上矩形的情况。但如果它只返回列表中的两个项目,它仍然可以正常工作。