假设我有一个这样的图像(数字用于解释,所以专注于白色):
我正在研究一种方法来创建轮廓的层次结构而不是平面列表。如上图所示:
-n1 holds 1 contour: n2
-n2 hold 3 contours: n3, n4, n5
-n5 holds 1 contour: n6
-n6 holds 1 contour: n7
在继续阅读之前,请确保您已理解上述内容。
我有方法addContainingBlob,这个方法在blob类中。如果blobToAdd在我添加它的blob的范围内,我已经检查了另一种方法。我在此行收到StackOverflowError
:b.addContainingBlob(blobToAdd); // <<<<<<
。
我在最后一小时打破了这个局面。有人能看出为什么会出错吗?
protected void addContainingBlob(Blob blobToAdd) {
if (containingBlobs.size() == 0) {
containingBlobs.add(blobToAdd);
return;
}
Rectangle r1 = new Rectangle();
r1.setBounds(blobToAdd.minX(), blobToAdd.minY(), blobToAdd.width(), blobToAdd.height());
Rectangle r2 = new Rectangle();
// first check if we already have a containing blob that
// can hold the one we like to add
for (Blob b : containingBlobs) {
r2.setBounds(b.minX(), b.minY(), b.width(), b.height());
if (r2.contains(r1)) {
b.addContainingBlob(blobToAdd); // <<<<<<
return;
}
}
// it can also be that one OR MORE of the containing blobs can fit in the blob we like to add
for (int i = containingBlobs.size()-1; i >= 0; i--) {
Blob b = containingBlobs.get(i);
r2.setBounds(b.minX(), b.minY(), b.width(), b.height());
if (r1.contains(r2)) {
containingBlobs.remove(i);
blobToAdd.addContainingBlob(b);
}
}
containingBlobs.add(blobToAdd);
}
答案 0 :(得分:2)
如果代码允许blob包含自身,则对blobToAdd.addContainingBlob(b)
的调用将导致无限递归,因为
if (r2.contains(r1)) {
b.addContainingBlob(blobToAdd); // <<<<<<
return;
}