如何检查 n 个控件的交集

本文关键字:控件 何检查 检查 | 更新日期: 2023-09-27 18:33:04

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

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

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

基本上,我知道使用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;
}

如何检查 n 个控件的交集

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

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 可以非常快速地处理这个问题。关于处理碰撞的响应,您需要提供在项目相交时要发生的情况的详细信息。