代码之家  ›  专栏  ›  技术社区  ›  Mark Toledo

如何找到重叠矩形的面积

  •  0
  • Mark Toledo  · 技术社区  · 6 年前

    我试图得到没有交集的重叠矩形区域。矩形的可视化如下所示:

    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAA--------------BBB
    AAAAAAAAAAAAAAAA--------------BBB
    AAAAAAAAAAAAAAAA--------------BBB
    AAAAAAAAAAAAAAAA--------------BBB
                    BBBBBBBBBBBBBBBBB
                    BBBBBBBBBBBBBBBBB
                    BBBBBBBBBBBBBBBBB
                    BBBBBB-----------CCCCCCCC
                    BBBBBB-----------CCCCCCCC
                    BBBBBB-----------CCCCCCCC
                          CCCCCCCCCCCCCCCCCCC
                          CCCCCCCCCCCCCCCCCCC
                          CCCCCCCCCCCCCCCCCCC
                          CCCCCCCCCCCCCCCCCCC
    

    我从这里得到答案 url ,目前以下代码对我很有帮助:

    import numpy as np
    
    A = np.zeros((100, 100))
    B = np.zeros((100, 100))
    
    A[rect1.top : rect1.bottom,  rect1.left : rect1.right] = 1
    B[rect2.top : rect2.bottom,  rect2.left : rect2.right] = 1
    
    area_of_union     = np.sum((A + B) > 0)
    area_of_intersect = np.sum((A + B) > 1)
    

    获取矩形区域(包含3个或更多矩形)的最有效方法是什么?如何在python中实现?任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  0
  •   ccssmnn    6 年前

    如果可以访问矩形的角点,则可以使用shapely模块并使用一些设置操作,如difference和union。 Documentation 说操作是高度优化的。

    from shapely.geometry import Polygon, Point
    
    # define rectangles as polygons using their border points
    A = Polygon(((0, 0), (2, 0), (2, 2), (0, 2)))
    
    B = Polygon(((-1, -1), (-1, 1), (1, 1), (1, -1)))
    
    C = Polygon(((0, 0), (-2, 0), (-2, -2), (0, -2)))
    
    print(A.area)  # 4.0
    print(B.area)  # 4.0
    print(C.area)  # 4.0
    
    b_without_a = B.difference(A)
    b_without_c = B.difference(C)
    
    print(b_without_a.area)  # 3.0
    print(b_without_c.area)  # 3.0
    
    total = b_without_a.intersection(b_without_c)
    
    print(total.area)  # 2.0