2010-08-10 6 views
2

나는 최소 x, 최소 y, 최대 x, 최대 y를 알고있는 복잡한 다각형을 가지고있다. 또한 왼쪽 위와 오른쪽 아래 꼭지점을 알고있는 또 다른 직사각형이 있습니다. 이 정보를 알면이 경계 상자가 충돌하는지 어떻게 알 수 있습니까? 감사 :경계 사각형 충돌 테스트?

답변

3

시도 뭔가 :

typedef struct rect { 
    int top;  // maximum y-coord 
    int bottom; // minimum y-coord 
    int left; // minimum x-coord 
    int right; // maximum x-coord 
} rectangle; 

// Returns 1 if the point (x, y) lies within the rectangle, 0 otherwise 
int is_point_in_rectangle(rectangle r, int x, int y) { 
    if ((r.left <= x && r.right >= x) && 
     (r.bottom <= y && r.top >= y)) 
     return 1; 
    return 0; 
} 

// Returns 1 if the rectangles overlap, 0 otherwise 
int do_rectangles_intersect(rectangle a, rectangle b) { 
    if (is_point_in_rectangle(a, b.left , b.top ) || 
     is_point_in_rectangle(a, b.right, b.top ) || 
     is_point_in_rectangle(a, b.left , b.bottom) || 
     is_point_in_rectangle(a, b.right, b.bottom)) 
     return 1; 
    if (is_point_in_rectangle(b, a.left , a.top ) || 
     is_point_in_rectangle(b, a.right, a.top ) || 
     is_point_in_rectangle(b, a.left , a.bottom) || 
     is_point_in_rectangle(b, a.right, a.bottom)) 
     return 1; 
    return 0; 
} 

당신은 단지 그것의 모든 사항을 반복하고 그들과 함께 is_point_in_rectangle를 호출, 어떤 다각형 동일한 기능을 수행 할 수 있습니다. 복합 다각형에 대한 경계 상자 만 있기 때문에이 방법을 사용하면 거짓 긍정을 얻을 수 있습니다. 즉, 사각형은 복합 다각형의 경계 상자 안에 있지만 다각형 자체 외부에 있습니다. 그러나이 제한은 복잡한 모양이 경계 상자로 단순화되는 모든 방법에 적용됩니다.

+0

이 알고리즘이 필요한 것보다 훨씬 더 효과적이라고 생각합니다. 최소한 do_rectangles_intersect()의 두 번째 테스트 집합은 중복됩니다. –

+0

위양성 (false positive)을 피하기 위해 어떻게 더 정확하게 할 수 있습니까? 감사합니다 – jmasterx

+0

@ 브라이언 - 두 번째 테스트는 사각형 A가 완전히 사각형 B 안에있는 경우를 감지하는 데 필요합니다.사각형은 겹치지 만 B의 모서리 중 어느 것도 A 안에 있지 않습니다. 다른 방법으로 그 점을 확인해야합니다. @ Jex- 복잡한 다각형에 경계 사각형을 사용하는 경우 오탐 (false positive)을 피할 수 없습니다. 직사각형과 임의의 다각형 사이의 충돌을 감지하려면 다른 질문이 필요합니다. – bta

2

간격 [Ax1, Ax2] 및 [Bx1, Bx2]가 겹치면 간격 [Ay1, Ay2] 및 [By1, By2]이 겹쳐있는 경우 사각형 A와 B가 충돌합니다.

+2

OP에는 복잡한 다각형이 포함되어 있으므로이 테스트는 너무 빠르다고 생각합니다. – ysap

+1

@yasp : 만질 수없는 폴리곤을 제거하는 것이 유용 할 수 있습니다. 따라서 더 비싼 방법을 사용하여 확인해야 할 쌍 수를 제거해야합니다. – Akusete

+0

@ ysap- OP에는 복잡한 다각형의 사각형 경계 상자 *가 있습니다. 이 방법은 두 개의 직사각형 모두에서 작동하므로 유효한 솔루션이어야합니다. OP가 경계 상자뿐만 아니라 원래의 다각형과 함께 작동한다면 예,이 방법에 대한 귀하의 예약에 동의 할 것입니다. – bta

0

나는 다음과 같이 작동한다고 생각합니다. 대부분의 경우이지만 더 복잡한 것은 사실이지만 바운딩 박스 검사보다 정확합니다. 다음과 같은 질문에 봐 : 포인트 다각형 내부에있는 경우가

Polygon in rectangle algorithm?

, 당신은 알아 내기위한 알고리즘을 참조하십시오. 이 테스트는 첫 번째 폴리 w.r.t의 각 지점에 적용 할 수 있습니다. 제 2의 것. 반대편. 테스트가 적어도 한 번 이상 통과하면 충돌이 발생합니다.

0

직사각형의 왼쪽 및 오른쪽 가장자리의 x 좌표 정렬 된 배열을 만듭니다. 그런 다음 "스캔 라인"을 사용하여 사각형을 왼쪽에서 오른쪽으로 이동합니다. 주사선과 겹치는 사각형의 위쪽 및 아래쪽 가장자리의 y 좌표를 포함하는 2 진 탐색 트리를 유지하십시오. 배열의 각 요소에 대해 왼쪽 또는 오른쪽 가장자리인지 확인합니다. 오른쪽 모서리 인 경우 BST에서 상응하는 상단 및 하단 모서리를 제거하십시오. 왼쪽 모서리 인 경우 BST에서 현재 사각형과 겹치는 사각형을 검색합니다. 하나가 있으면 겹침을 반환합니다. 그런 다음 사각형의 위쪽 및 아래쪽 가장자리의 y 좌표를 BST에 추가하십시오. 검색에는 O (n log n) 시간이 걸리므로 직사각형을 정렬하는 데 O (n log n) 시간이 걸리고 2n 반복마다 O (log n) 시간이 걸립니다. Google 검색 결과에서 복사됩니다. 이 같은

+1

두 개의 사각형이 겹치는지를 판단하기에는 과도한 소리가 들립니다. 임의의 수의 직사각형에 대해서는 좋은 해결책이 될 수 있지만이 문제는 두 개만 사용하는 것입니다. – bta

+0

사실, 임의의 수의 직사각형에 적용 할 수 있습니다. 도움이 될 거라 생각 했어요. – joshu

관련 문제