Calculate overlapped area between two rectangles

前端 未结 2 1828
[愿得一人]
[愿得一人] 2020-12-04 16:42

\"enter

I want to calculate the overlapped area \"THE GRAY REGION\" between red and bl

相关标签:
2条回答
  • 2020-12-04 17:29

    As this question has a shapely tag, here is a solution using it. I will use the same rectangles as in the tom10 answer:

    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
    

    This is much more concise than the version in the accepted answer. You don't have to construct your own Rectangle class as Shapely already provides the ready ones. It's less error-prone (go figure out the logic in that area function). And the code itself is self-explanatory.


    References:
    Docs for object.intersection(other) method

    0 讨论(0)
  • 2020-12-04 17:33

    This type of intersection is easily done by the "min of the maxes" and "max of the mins" idea. To write it out one needs a specific notion for the rectangle, and, just to make things clear I'll use a 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 
    

    If you don't like the namedtuple notation, you could just use:

    dx = max(a[0], b[0]) - min(a[2], b[2])
    

    etc, or whatever notation you prefer.

    0 讨论(0)
提交回复
热议问题