2017-03-15 4 views
0

여러 개의 중복되는 사각형의 바깥 쪽 경계를 얻고 싶습니다.인접한 사각형의 경계를 계산하십시오.

주어진 사각형의 이웃을 계산하는 함수를 작성했지만 인접한 사각형의 외부 경계를 얻는 방법이 있는지 알고 싶습니다. E, W, N, S :

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 

상기 프로그램은 각 방향에 대해 이웃 반환 여기

제가 가지고있는 것이다. 여기

이 기능을 포함하는 경우입니다 :

Adjacent rectangle in S direction

기능은 바로 이웃이 무엇 반환하지만 나는 모든 인접 사각형의 외부 경계를 반환하는 기능을 갖고 싶어 :

:이 경우

Abutting rectangles

는 입력은 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 라이브러리가 있습니까?

+0

안녕하세요, 예상 출력에 입력을 추가 할 수 있습니까? – Neil

+0

지적 해 주셔서 고맙습니다. 나는 그것을 지금 추가했다. – sanjay

답변

2

사용자 정의 솔루션을 주장하는 경우 나도 몰라,하지만 있다면, 아마도 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이 결과로 생성됩니다. 예를 들어 참조 사각형 등이 포함 된 구성 요소를 필터링 할 수 있습니다.

+0

포인터 주셔서 감사. 내 환경에 매끈한 설치를 시도했지만 일부 C 바이너리가 누락되어 있으며이를 수행 할 수있는 관리자 권한이 없습니다. : ( – sanjay

+0

나는 matplotlib와 cairo를 사용할 수 있습니다 ... 그들이이 문제를 도울 수 있는지 확실하지 않습니다. – sanjay

관련 문제