查找两个矩形的重叠区域(在 C# 中)

Posted

技术标签:

【中文标题】查找两个矩形的重叠区域(在 C# 中)【英文标题】:Finding the overlapping area of two rectangles (in C#) 【发布时间】:2010-12-05 19:02:27 【问题描述】:

编辑:

我用来解决问题的简单代码以防万一有人感兴趣(感谢 Fredrik):

    int windowOverlap(Rectangle rect1, Rectangle rect2)
    
        if (rect1.IntersectsWith(rect2))
        
            Rectangle overlap = Rectangle.Intersect(rect1, rect2);
            if (overlap.IsEmpty)
                return overlap.Width * overlap.Height;
        

        return 0;
    

原问题:

我想知道一种快速而肮脏的方法来检查两个矩形是否重叠以及它们是否计算重叠的面积。出于好奇,我对以下情况感兴趣:1)两个矩形中的所有线都是垂直或水平的,或者 2)任何两个矩形的一般情况,但我真正需要的唯一答案是情况 1。

我的想法是:

double areaOfOverlap( Rect A, Rect B)

    if ( A.Intersects(B) )
    
        // calculate area
        // return area
    

    return 0;

对于 A.Intersects() 我正在考虑使用分离轴测试,但如果矩形只有水平线和垂直线,是否有更简单(更快)的检查方法?

如果矩形只有水平线和垂直线,那么计算它们相交的区域是否有一种快速的方法?

最后,这与问题无关,但如果有人对一本好书/网页提出任何建议,我将不胜感激,我可以在其中复习计算机图形学的数学。我已经离开大学一段时间了,感觉好像我忘记了一切:)!其他人有这个问题吗?

(注意:我发现这个问题与this 不同,后者似乎更复杂,并没有直接回答问题。)

【问题讨论】:

水平矩形是垂直矩形,取决于你认为哪一边是顶部。 if (overlap.IsEmpty) 应该是 if (!overlap.IsEmpty) 【参考方案1】:

也许我误解了你的问题,但 Rectangle.Intersect 方法不工作吗?它返回相交的面积,然后你可以很容易地计算出它的面积。

【讨论】:

【参考方案2】:

听起来像是基本的碰撞检测。你看过this page on Wikipedia?

迈克

编辑:弗雷德里克在我做这个的同时做出回应,他的回答得到了我的赞成(:

【讨论】:

谢谢,我去看看这个网站!

以上是关于查找两个矩形的重叠区域(在 C# 中)的主要内容,如果未能解决你的问题,请参考以下文章

什么是找到重叠矩形区域的有效算法

计算两个矩形之间的重叠面积

C++编程,求俩矩形重叠面积的代码

查找两个数据帧之间的重叠区域

Altium AD20如何选择重叠在下方的元件?如何对元件快速选择选择区域内部选择矩形接触到的对象

矩形重叠