这不是一个家庭作业问题:)
我有一组散布在图像上的矩形。我想合并(创建一个联合)每组相交的矩形。如果矩形不与其邻居相交,则它保持不变。
问题是合并的矩形可以交叉以前没有考虑过的矩形;合并的矩形也可以与新合并的矩形相交。我想抓住这些案件。
所以,在我看来,它需要迭代(尝试每个矩形对集合中的每个其他矩形)和递归(再次尝试每个合并的矩形对集合,包括合并的rects)。
我该如何解决这个问题?我在Java工作,但这更像是一个算法问题,而不是面向语言的问题。
谢谢!
编辑:添加了相关代码,以更好地说明我现在处理它的糟糕方式。
public static List<BinaryRegion> mergeRegions(List<BinaryRegion> regions)
{
List<BinaryRegion> merged = new ArrayList<BinaryRegion>();
geoModel = new GeometryFactory();
Polygon polys[] = new Polygon[regions.size()];
for (int i = 0; i < regions.size(); i++)
{
Polygon p = convertRectangleToPolygon(regions.get(i)
.getBoundingBox());
polys[i] = p;
}
System.out.println("Converted " + regions.size() + " polys");
for (int i = 0; i < regions.size(); i++)
{
System.out.println("Sending in poly " + i);
ArrayList<Polygon> result = mergePoly(polys[i], polys);
System.out.println("After run, size=" + result.size());
}
return merged;
}
private static ArrayList<Polygon> mergePoly(Polygon p, Polygon[] polys)
{
ArrayList<Polygon> merges = new ArrayList<Polygon>();
for (int i = 0; i < polys.length; i++)
{
if (p.equals(polys[i]))
System.out.println("found the exact match at " + i);
else if (p.intersects(polys[i]))
{
System.out.println("Found intersection at " + i);
System.out.println("Other poly is area "+polys[i].getArea());
Polygon u = (Polygon) p.union(polys[i]);
System.out.println("Merge size="+u.getArea());
merges.add(u);
}
else
merges.add(polys[i]);
}
return merges;
}
答案 0 :(得分:3)
不完全确定这种嵌套迭代方法是否真的可行(特别是因为在调用mergePoly
之后我没有看到你是如何处理合并区域的)。与其他所有多边形相比,不是一次使用一个多边形,为什么不保留中间步骤并重新运行合并,直到没有更多的交叉点?有点像:
private static ArrayList<Polygon> mergePoly(Polygon[] polys)
{
List<Polygon> polygons = new ArrayList<Polygon>(Arrays.asList(polys));
boolean foundIntersection = false;
do
{
foundIntersection = false;
for (int i = 0; i < polygons.size(); i++)
{
Polygon current = polygons.get(i);
for (int j = i + 1; j < polygons.size(); j++)
{
if (current.intersects(polygons.get(j)))
{
foundIntersection = true;
current = (Polygon)current.union(polygons.remove(j--));
System.out.println("Merge size="+u.getArea());
}
}
polygons.set(i, current);
}
} while(foundIntersection);
return polygons;
}
自从我使用Java以来已经有一段时间了,但逻辑非常明显。您执行两次多边形迭代。外部迭代是您的“当前”多边形,您将合并所有内部多边形(随着时间的推移将它们从集合中移除)。在每次外部迭代之后,您只需使用(可能)合并多边形在该索引处设置元素,然后移动到系列中的下一个多边形。你将继续这样做,直到你不再再融合为止。请记住,这是一个非常天真的实现,你可能最好将其分解为“一半”并合并这些较小的子集(想想mergesort)。
答案 1 :(得分:2)
您可以使用扫描线算法查找矩形(example1,example2)和union-find algorithm的交点,以有效地合并矩形集。