2012-02-15 3 views
5

구글 guavas를 사용하여 "비교 가능한"Java 클래스로 구현 된 사각형 컬렉션 (Java TreeSet)을 검사하는 방법을 찾고 있습니다. x 및 y 범위 - 교차점 및 홀. 옵션이 kd-trees를 사용할 수 있다는 것을 알고 있지만 그러한 kd-tree를 만드는 방법을 모릅니다. (4d가되어야하는 직사각형을위한 것이지요?) 그리고 문제를 해결하는 방법 , 구멍).구멍과 교차를위한 직사각형 컬렉션을 확인하는 방법은 무엇입니까?

정렬은 y 축 위에 x 축 우선 순위를 지정합니다.

EDIT : (문제를 다시 설명하려고합니다.) 유스 케이스는 임의의 테이블 ("헤더", "사전 열", "데이터"의 2 또는 3 블록으로 구성된)을 만드는 것입니다. 각 블록에는 교차 및 구멍 (즉, 유효하지 않은 html 또는 테이블 데이터의 다른 소스로 제공)이 없음을 보장해야합니다 (이 외에도 블록은 함께 맞아야합니다). 현재 (방금 아이디어가 있습니다) 위치 (x, y)가 차지하는 2 차원 배열에 저장하려고합니다. 결국 모든 위치는 정확히 한 번 점유되어야합니다.

+0

이 숙제입니까? –

+0

가능한 한 자세히 설명하여 문제를 다시 설명하는 것이 좋습니다. 문제를 진술 할 수 없다면 해결책을 찾기가 매우 어렵습니다. –

+0

은 x/y 축에 평행 한 직사각형의 가장자리입니까, 아니면 어떤 방향으로있을 수 있습니까? – PeskyGnat

답변

6

이러한 유형의 문제를 해결하는 데는 여러 가지 방법이 있지만 각각 다른 장단점이 있습니다. - 두 사각형이 교차하는 경우, 중복이

사각형 쌍 사거리 + 지역 합계 사각형의 모든 쌍에

봐 : 여기에 그들 중 일부입니다. 사각형 영역을 추가하고 합계가 캔버스 영역과 일치하는지 확인하십시오. 영역이 일치하지 않으면 간격이 있습니다.

회화 이것은 당신이 언급 한 방법은 다음과 같습니다 캔버스의 크기를 가진 2 차원 배열을 만들 수 있습니다. 그런 다음 직사각형을 반복하고 어레이에 "페인트"합니다.

이 접근 방식의 최적화 중 하나는 좌표 압축입니다. 사각형 ([10,20], (15,25), [(7,3), (15,25)])이 있다고 가정 해 봅시다. 별개의 x 좌표 (7, 10, 15)를보고 (0, 1, 2) 및 고유 한 y 좌표 (3, 20, 25)로 다시 매핑하고 다시 매핑 할 수 있습니다 (0, 1, 2). 그런 다음 직사각형 [(1,1), (2, 2)] 및 [(0,0), (2,2)]로 남겨 지므로 그림에 대해 3x3 배열 만 필요합니다. 26x26 정렬.

스윕 라인 알고리즘

는 '재미'지점에서 중지 및 영역을 점유하는 추적을 유지, 왼쪽에서 오른쪽으로 선을 스윕.

2D 범위 나무

효율적 직사각형 범위에서 쿼리를 수행 할 수있는 데이터 구조.

어느 것을 골라야합니까?

당신이 가지고있는 직사각형의 수, 지역에서의 분포도, 알고리즘의 속도, 얼마나 복잡합니까? 등 내가 언급 한 처음 두 알고리즘은 다음과 같습니다. 후자의 두 개보다 훨씬 간단하기 때문에 거기에서 시작하는 것이 좋습니다.

추가 정보

당신이 이러한 알고리즘에 대한 자세한 내용을 보려면 원하는 경우 온라인 "사각형 조합"를 검색해보십시오. 가장 효율적인 솔루션은 스윕 라인 알고리즘입니다.

  1. What is an Efficient algorithm to find Area of Overlapping Rectangles
  2. http://compgeom.cs.uiuc.edu/~jeffe/open/klee.html
  3. J. L. 벤틀리, 알고리즘 클레의 사각형 문제 : 다음

    은 스윕 라인 알고리즘에 대한 참조의 몇 가지 있습니다. 게시되지 않은 메모, 컴퓨터 과학과, 카네기 멜론 대학, 1977 참조 3. 일반적으로 사각형 조합의 행 청소 알고리즘의 원본 소스로 제공,하지만 난 사실을 찾지 못했음을 인정해야한다

종이가 온라인이기 때문에 아마 "미공개"입니다 ...

+0

이 문제를 설명하는 책 또는 inetlink에 대한 참조를 제공해 주시겠습니까? 그 해결책이 궁금합니다. 내 특별한 경우에 나는 많은 직사각형 (약 100)을 다룰 필요가 없지만 더 나은 알고리즘이 있다는 것을 알고있는 한 더 나은/최상의 알고리즘을 시도하는 것에 저항 할 수 없다. – dermoritz

+1

"추가 정보" 섹션을 제 응답에 - 잘하면 도움이됩니다. 알고리즘에 대해 재미있게 학습하십시오. :) –

+1

@Igor이 맞습니다. 벤틀리 (Bentley)는이 분야에서 많은 고전 서적과 세미 논문을 저술했습니다. 그의 논문은 나에게 귀중한 것입니다. 직각 경계와 관련이 있다는 사실을 최소화하지 마십시오. 그것은이 분야에서 많은 연구가 이루어져 왔기 때문에 큰 문제입니다. 스윕 라인 방식은이 문제에 대해 구현하기가 매우 간단하며 축을 선택하고 해당 축에 직각 모서리를 투영하고 해당 축의 이벤트 선은 직사각형의 시작 또는 끝을 나타냅니다. Computational Geometry의 Preparata와 Shamos에 의한 소개의 8 장을보십시오. – babernathy

관련 문제