使用linq查找所有相交的矩形对

时间:2015-08-19 09:46:54

标签: c# linq rectangles

我有一个矩形列表(xpos,ypos,widht,height):

List<Rectangle> rects = new List<Rectangle>();

此方法可以判断两个矩形是否相交: Rectangle.IntersectsWith()

我想使用linq从列表中获取所有相交的矩形对...这可能吗?

2 个答案:

答案 0 :(得分:4)

是!

var intersecting = rects
    .SelectMany((x, i) => rects.Skip(i + 1), Tuple.Create)
    .Where(x => x.Item1.IntersectsWith(x.Item2))
    .ToList();

请注意,这是一个O(n ^ 2)操作,没有某种形式的加速(例如,为每个x和y维度保留Rectangle的列表,排序,以便您可以执行单个O(n)通过每个维度。)

就个人而言,为了清晰起见,我只是坚持使用典型的嵌套循环:

var intersecting = new List<Tuple<Rectangle, Rectangle>>();
for (int i = 0; i != rects.Count; ++i) {
    for (int j = i + 1; j != rects.Count; ++j) {
        if (rects[i].IntersectsWith(rects[j]))
            intersecting.Add(Tuple.Create(rects[i], rects[j]));
    }
}

答案 1 :(得分:0)

Cameron的答案适用于少量矩形。如果您遇到数字较大的性能问题,可以使用k-d treequadtree添加一些空间分区策略以减少要检查的交叉点候选项的数量。