如何检查n个控件的交集

时间:2013-09-26 13:07:27

标签: c# winforms

我目前正在开发一个Winforms C#应用程序,它允许用户通过鼠标操作移动它们来定位可滚动区域上的对象。 Scrollable区域和对象都是面板控件。

用户从工具栏中选择对象类型后,通过鼠标单击动态地将对象放置在可滚动区域上。

当用户将对象从一个位置移动到另一个位置时,我需要防止可滚动区域上对象的边界交叉。

基本上,我知道使用linq的交叉方法检查交叉点并不困难。但是,在大多数情况下,可滚动区域中有许多对象。所以,我一直在想找到一个高效快速的逻辑来检查n个对象的可能交叉。

我很高兴你的建议。

由于

我在MouseUp事件中尝试了以下方法(当用户发布对象时)

private bool IsIntersected(BaseNode movingControl)
{
    List<BaseNode> controls = (from x in Controls.Cast<Control>() 
                                                 .Where(x => x.GetType()
                                                 .IsSubclassOf(typeof(BaseNode)))
                               select (BaseNode)x).ToList();

    if (controls.Count > 0 && controls.Contains(movingControl))
        controls.Remove(movingControl);

    foreach (BaseNode o in controls)
        if (o.DisplayRectangle.IntersectsWith(movingControl.DisplayRectangle))
            return true;

    return false;
}

1 个答案:

答案 0 :(得分:1)

假设每个对象都是一个Rectangle,听起来好像你应该像gamedev一样处理它。最终没有办法迭代每个项目(除非你走QuadTrees的路线),但最终:

for(int i = 0; i<items.count();i++)
{
    var ob = items[i];

    for(int j = i+1;j<items.Count();j++)
    {
        if(ob.Rectangle.Intersects(items[j].rectangle))
        {
            //DO Somthing
        }
    }
}

我会提防过早优化,因为最终现代CPU可以非常快速地处理这个问题。关于处理碰撞的响应,您需要提供物品相交时想要发生的细节。