【问题标题】:Calculate boundary of adjacent rectangles计算相邻矩形的边界
【发布时间】:2017-03-15 17:17:45
【问题描述】:

我想获取几个重叠矩形的外边界。

我已经编写了一个函数来计算给定矩形的邻居,但我想看看是否有办法获得相邻矩形的外边界。

这是我所拥有的:

def get_neighboring_rectangles (r, rectList):
overlapDict = {}
rminX, rmaxX, rminY, rmaxY = return_bbox_of_rectangle(r)
for rectCheck,ri in rectList:
    if r == rectCheck: continue
    rcminX, rcmaxX, rcminY, rcmaxY = return_bbox_of_rectangle(rectCheck)
    for d in ['E', 'W', 'N', 'S']:
        if not ((rcmaxY < rminY or rcminY > rmaxY) or (rcmaxY == rminY) or (rcminY == rmaxY)):
            if d == 'W' and rcmaxX == rminX:
                if d not in overlapDict: overlapDict[d] = []
                overlapDict[d].append((rectCheck,ri))
            if d == 'E' and rcminX == rmaxX:
                if d not in overlapDict: overlapDict[d] = []
                overlapDict[d].append((rectCheck,ri))
        if not ((rcmaxX < rminX or rcminX > rmaxX) or (rcmaxX == rminX) or (rcminX == rmaxX)):
            if d == 'S' and rcmaxY == rminY:
                if d not in overlapDict: overlapDict[d] = []
                overlapDict[d].append((rectCheck,ri))
            if d == 'N' and rcminY == rmaxY:
                if d not in overlapDict: overlapDict[d] = []
                overlapDict[d].append((rectCheck,ri))
return overlapDict

上述程序返回每个方向的邻居:E、W、N、S。

以下是此功能涵盖的情况:

该函数只返回什么是直接邻居,但我希望有一个功能来返回所有相邻矩形的外边界:

在这种情况下,输入将是所有 3 个矩形的边界列表:

[[(0,0) (7,0) (7,4) (0,4)] [(4,4) (7,4) (7,6) (4,6)] [(1,6) (7,6) (7,10) (1,10)]]

预期输出 - [(0,0) (7,0) (7,10) (1,10) (1,6) (4,6) (4,4) (0,4)]

另外,请注意,可能有第四个矩形与上面的 3 个矩形不相邻。理想情况下,第四个边界应按原样返回。 (我可以使用我的邻居检测算法来完成)

对于如何解决这个问题,我有点迷茫。有没有具有这种功能的 Python 库?

【问题讨论】:

  • 嘿,你能在输入中添加预期输出吗?
  • 感谢您指出这一点。我现在已经添加了。

标签: python rectangles


【解决方案1】:

我不知道您是否坚持使用自定义解决方案,但如果不是,那么shapely 包也许可以提供一个实用的工具来解决这个问题:

from shapely.geometry import MultiPolygon, Polygon, box
from shapely.ops import unary_union

L = [box(0, 0, 7, 4), box(4, 4, 7, 6), box(1, 6, 7, 10), box(100, 100, 110, 110)]
P = unary_union(L)
if P.geom_type == 'Polygon':
    P = MultiPolygon([P])

for Q in P:
    print(list(Q.exterior.coords))

这给出了:

[(110.0, 100.0), (110.0, 110.0), (100.0, 110.0), (100.0, 100.0), (110.0, 100.0)]
[(7.0, 4.0), (7.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 4.0), (4.0, 6.0), (1.0, 6.0), (1.0, 10.0), (7.0, 10.0), (7.0, 6.0), (7.0, 4.0)]

在这里,L 包含来自您的问题的矩形(框)列表以及不涉及任何其他矩形(框)的列表。函数unary_union 计算所有它们的并集,所以一般来说,结果是一个 MultiPolygon,其组件很容易访问,如上面的代码所示。然后,您可以过滤包含您的参考矩形等的组件。

【讨论】:

  • 感谢您的指点。我尝试在我的环境中安装 shapely,但我缺少一些 C 二进制文件,而且我没有管理员权限来执行此操作。 :(
  • 我确实有 matplotlib 和 cairo 可用...不确定他们是否可以帮助解决这个问题。
猜你喜欢
  • 2010-10-13
  • 2019-08-11
  • 2010-10-11
  • 2010-09-22
  • 2014-08-08
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
相关资源
最近更新 更多