检查多个矩形是否相交

时间:2014-05-10 15:07:59

标签: c#

我遇到了一个问题我有一个填充了多个矩形的列表,我需要检查这些矩形中是否有任何一个相互重叠,因为列表不断变化,使用foreach循环将返回错误。 还有其他方法来检查碰撞吗?


评论代码

for (var x = 0; x < Water.Count(); x++ ) 
{ 
  Rectangle rect = Water[x]; 
  if(rect.Y < 699)
  { 
    rect.Y++;; 
  }
  Water[x] = rect; 
  frameGraphics.FillRectangle(new SolidBrush(Color.Red), Water[x]); 
} 

这是我的代码,使矩形下降并检查y&lt; 699现在我需要检查这个列表中的一个矩形是否相互碰撞

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该使用lock或某种concurrent collection来同步对您正在迭代的列表的访问,或者在检查交集之前复制该集合。

您可以使用Rect.Intersect

检查路口

这是一个例子(从msdn复制)

private Rect intersectExample2()
{
    // Initialize new rectangle.
    Rect myRectangle = new Rect();

    // The Location property specifies the coordinates of the upper left-hand  
    // corner of the rectangle. 
    myRectangle.Location = new Point(10, 5);

    // Set the Size property of the rectangle with a width of 200 
    // and a height of 50.
    myRectangle.Size = new Size(200, 50);

    // Create second rectangle to compare to the first.
    Rect myRectangle2 = new Rect();
    myRectangle2.Location = new Point(0, 0);
    myRectangle2.Size = new Size(200, 50);

    // Intersect method finds the intersection between the specified rectangles and  
    // returns the result as a Rect. If there is no intersection then the Empty Rect  
    // is returned. resultRectangle has a size of 190,45 and location of 10,5. 
    Rect resultRectangle = Rect.Intersect(myRectangle, myRectangle2);

    return resultRectangle;

}

这里有一些代码可以检查所有多个矩形是否相交。

bool CheckIfAllIntersect(IEnumerable<Rect> rectangles)
{
    return rectangles.Aggregate(rectangles.FirstOrDefault(), Rect.Intersect) != Rect.Empty;
}

如果您希望任何矩形相交,可以使用以下

bool CheckIfAnyInteresect(IEnumerable<Rect> rectangles) 
{
    return rectangles.Any(rect => rectangles.Where(r => !r.Equals(rect)).Any(r => r.IntersectsWith(rect)));
}