我目前正在开发一个 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;
}