我目前正在开发一个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;
}
答案 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可以非常快速地处理这个问题。关于处理碰撞的响应,您需要提供物品相交时想要发生的细节。