我有一个重叠矩形的列表。我需要找到一个列表列表,其中返回所有重叠的矩形。例如,在一个包含 7 个矩形的列表中,如果 4 个矩形重叠并且其余部分是分开的,那么列表的列表应该如下所示:
[0]: r1, r2, r3, r4
[1]: r5
[2]: r6
[3]: r7
我知道我必须执行命中测试。我正在寻找创建链的算法或示例。
谢谢
我已经尝试过这段代码:有时它可以工作,有时它会抛出 index out of bound 有点异常。
while (rects.Count != 0)
{
listOfRects.Add(joinRectangles(rects, new List<Rectangle>(), rects[rects.Count - 1]));
}
private List<Rectangle> joinRectangles(List<Rectangle> rects, List<Rectangle> tempRects, Rectangle curRect)
{
for (int j = rects.Count; j-- > 0; )
{
if (hitTest(curRect, rects[j]) == true)
{
if (tempRects.Contains(rects[j]) == false)
{
tempRects.Add(rects[j]);
curRect = rects[j];
rects.Remove(rects[j]);
j--;
joinRectangles(rects, tempRects, curRect);
}
}
}
return tempRects;
}
如果我提供这些坐标,那么我应该得到一个包含 4 个列表的列表,如下所示:
[0]: 1 rectangle
[1]: 3 rectangles
[2]: 1 rectangle
[3]: 1 rectangle
<?xml version="1.0" encoding="utf-16"?>
<rectangles>
<rectangle>
<X1>50.833333344375</X1>
<Y1>100</Y1>
<X2>53.833333344375</X2>
<Y2>127.00000004975</Y2>
</rectangle>
<rectangle>
<X1>136.500000033125</X1>
<Y1>100</Y1>
<X2>139.516666655625</X2>
<Y2>127.00000004975</Y2>
</rectangle>
<rectangle>
<X1>50.833333344375</X1>
<Y1>130.647222172472</Y1>
<X2>53.833333344375</X2>
<Y2>157.647222222222</Y2>
</rectangle>
<rectangle>
<X1>136.500000033125</X1>
<Y1>130.647222172472</Y1>
<X2>139.516666655625</X2>
<Y2>157.647222222222</Y2>
</rectangle>
<rectangle>
<X1>136.500000033125</X1>
<Y1>100</Y1>
<X2>139.516666655625</X2>
<Y2>157.3333333830833</Y2>
</rectangle>
<rectangle>
<X1>179.3333333775</X1>
<Y1>100</Y1>
<X2>182.3333333775</X2>
<Y2>157.3333333830833</Y2>
</rectangle>
</rectangles>