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

Python 计算两个矩形之间的重叠面积,python,numpy,matplotlib,polygon,shapely,Python,Numpy,Matplotlib,Polygon,Shapely,我想计算红色和蓝色矩形之间的重叠区域“灰色区域” 每个矩形由其四个角坐标定义。重叠区域的结果单位为单位平方 我无法想象我该怎么做 如有任何创造性意见,将不胜感激 通过“最大值中的最小值”和“最小值中的最大值”的思想,这种类型的交叉点很容易实现。要写出它,需要对矩形有一个特定的概念,并且,为了清楚起见,我将使用一个namedtuple: from collections import namedtuple Rectangle = namedtuple('Rectangle', 'xmin ymin

我想计算红色和蓝色矩形之间的重叠区域“灰色区域”

每个矩形由其四个角坐标定义。重叠区域的结果单位为单位平方

我无法想象我该怎么做


如有任何创造性意见,将不胜感激

通过“最大值中的最小值”和“最小值中的最大值”的思想,这种类型的交叉点很容易实现。要写出它,需要对矩形有一个特定的概念,并且,为了清楚起见,我将使用一个namedtuple:

from collections import namedtuple
Rectangle = namedtuple('Rectangle', 'xmin ymin xmax ymax')

ra = Rectangle(3., 3., 5., 5.)
rb = Rectangle(1., 1., 4., 3.5)
# intersection here is (3, 3, 4, 3.5), or an area of 1*.5=.5

def area(a, b):  # returns None if rectangles don't intersect
    dx = min(a.xmax, b.xmax) - max(a.xmin, b.xmin)
    dy = min(a.ymax, b.ymax) - max(a.ymin, b.ymin)
    if (dx>=0) and (dy>=0):
        return dx*dy

print area(ra, rb)
#  0.5 
如果您不喜欢namedtuple表示法,可以使用:

dx = max(a[0], b[0]) - min(a[2], b[2])
等等,或者你喜欢的任何符号。

因为这个问题有一个标签,这里有一个使用它的解决方案。我将使用与中相同的矩形:

这比公认答案中的版本要简洁得多。您不必像Shapely已经提供的那样构造自己的
Rectangle
类。它不太容易出错(去弄清楚
区域
函数中的逻辑)。代码本身是不言自明的


参考文献:

那么您的问题到底是什么?如果知道所有角点,可以轻松计算相交矩形的角点。角点坐标和
min
max
函数应该是您所需要的全部。shapely可以计算相交矩形的角点吗?我不知道。然而,我很确定你可以自己计算出这些角点。只要看看左上角:要在十字路口,你必须有一个x_坐标至少与红色和蓝色的左端的最大值一样大,一个y_坐标最多与红色和蓝色的上端的最小值一样大。。。四个角点的每个点都有相似的参数。这很简单,但主要问题是符号。如何在代码中定义矩形?例如,一个具有如下值的元组:
(xmin,ymin,xmax,ymax)
,等等@tom10矩形的每个角都被定义为(x,y)坐标值,如您所说,可以用于获取(xmin,ymin,xmax,ymax)。谢谢您的接受,但即使蓝色多边形位于红色多边形的左侧,您的代码仍然有效吗?@just:是的,这两种方法都有效。使用max和min方法只是一种简单的方法,否则将是一组复杂的条件来确定相对位置。也就是说,把
max(a.xmin,b.xmin)
读作“最左上角”,等等。另外,我把我的答案改为现在包含矩形不相交的情况。如何获得重叠的百分比面积?@SanthoshDhaipuleChandrakanth:最好单独问一个问题。例如,这里不清楚你所说的百分比是什么意思,具体来说,重叠的区域是清楚的,通过你将其与什么区域进行比较——最大区域,两个初始矩形的区域,等等?只需注意:确保使用右点——在笛卡尔坐标轴上,“左上”是x.min,但是y.max。在显示器上,x.min,y.min位于左上角,x.max,y.max位于右下角。@quant不,Shapely只能用于平面几何计算。据你所知,高维是否也有类似的情况?@quant我从未处理过3维或更高维的几何体。谷歌提供了以下链接。也许他们能帮上什么忙:。
from shapely.geometry import Polygon

polygon = Polygon([(3, 3), (5, 3), (5, 5), (3, 5)])
other_polygon = Polygon([(1, 1), (4, 1), (4, 3.5), (1, 3.5)])
intersection = polygon.intersection(other_polygon)
print(intersection.area)
# 0.5