0

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

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

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

基本上,我知道使用 linq 的 intersect 方法检查交叉点并不难。但是,在大多数情况下,可滚动区域中有很多对象。因此,我一直在考虑找到一种有效且快速的逻辑来检查 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;
}
4

1 回答 1

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

于 2013-09-26T13:14:47.180 回答