C# 检查矩形是否在画布XAML中相交

C# 检查矩形是否在画布XAML中相交,c#,wpf,xaml,canvas,C#,Wpf,Xaml,Canvas,我有一个画布,我在其中画不同的矩形。我有一个集合中的矩形坐标。每次将矩形添加到画布时,我都需要检查它是否与其他现有矩形重叠。 我用画布中的每个现有矩形检查一个新矩形,以了解该矩形是否与任何其他矩形重叠。 这是最有效的解决方案吗 foreach(System.Windows.Shapes.Rectangle r in rectCollection) { IntersectionDetail d1 = r.RenderedGeometry.Fi

我有一个画布,我在其中画不同的矩形。我有一个集合中的矩形坐标。每次将矩形添加到画布时,我都需要检查它是否与其他现有矩形重叠。 我用画布中的每个现有矩形检查一个新矩形,以了解该矩形是否与任何其他矩形重叠。 这是最有效的解决方案吗

foreach(System.Windows.Shapes.Rectangle r in rectCollection)
            {
                IntersectionDetail d1 = r.RenderedGeometry.FillContainsWithDetail(this.rect.RenderedGeometry);
                if(d1 == IntersectionDetail.Intersects)
                {
                    MessageBox.Show("New Rectangle intersects with existing rectangle");
                }

            }

为了检查你的矩形是否与其他矩形相交,在最坏的情况下,你需要进行的最少交互次数是至少一次遍历它们;你无法避免这个事实。这意味着在最坏的情况下,您的复杂度不能低于
O(n)

这种复杂性可以通过像您这样的单个循环来实现,或者您可以简单地使用LINQ方法
.Any()
,它将在有交叉点时停止(因此我们可以得到
O(1)
的最佳情况)

在这里,最坏的情况是“无交点”,因为您需要检查下一个矩形以查看该矩形是否会碰撞。最好的情况是在第一次检查时点击

假设您的集合称为坐标,并且您正在检查的矩形为newRect,检查将变成:

if (coordinates.Any(c => c.IntersectsWith(newRect)))
{
    //There is overlapping
}

在上一次更新中,很明显,集合中没有“矩形坐标”,而是来自
Windows.Shapes
矩形,这根本不是一回事<代码>矩形
仅包含关于其宽度和高度的信息,而不包含其自身位置的信息

在循环之前,您需要使用它们在画布上的位置及其尺寸将它们转换为
Rect

IEnumerable<Rect> coordinates = rectCollection.Select(r => new Rect(Canvas.GetLeft(r), Canvas.GetTop(r), r.Width, r.Height));
但是,逻辑与您的稍有不同,因此如果它有效,请随意使用您想要的逻辑。基本上,我使用的是这样一个事实:如果只有边界接触,那么相交区域将只有一个维度

所以支票将改为

if (coordinates.Any(c => c.InteriorIntersectsWith(newRect)))
{
    //There is overlapping
}

谢谢,这很有效。然而,我有一个问题:在这个场景中,当我绘制一个与现有矩形相邻的矩形时,即一个矩形结束,下一个矩形开始,因此它共享满足条件的坐标。但我想把这种情况排除在条件之外。我是如何做到的。我得到的解决方案是:if(coordinates.Any(c=>c.IntersectsWith(newCordinates)和&(newCordinates.Xif (coordinates.Any(c => c.InteriorIntersectsWith(newRect))) { //There is overlapping }