我遇到了一个问题我有一个填充了多个矩形的列表,我需要检查这些矩形中是否有任何一个相互重叠,因为列表不断变化,使用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现在我需要检查这个列表中的一个矩形是否相互碰撞
谢谢!
答案 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)));
}