두 직사각형의 교차를 감지하는 알고리즘?


143

두 사각형이 교차하는지 감지하는 알고리즘을 찾고 있습니다 (하나는 임의의 각도로, 다른 하나는 수직 / 수평 선으로 만).

하나의 모서리가 다른 ALMOST에 있는지 테스트합니다. 사각형이 십자형을 형성하면 실패합니다.

수직선에 특별한 경우가 필요한 선의 기울기를 사용하지 않는 것이 좋습니다.


모서리 검사에 추가하면 두 번째 사각형이 각진 사각형의 경계 (직사각형) 안에 있는지 확인하면 어떻게됩니까?
Wes P

이 언어로 어떤 언어를 사용 하시겠습니까? Java에는이를 수행 할 수있는 내장 클래스가 있기 때문입니다.
Martijn

그래픽 API와 대부분의 GUI 라이브러리 (스윙과 같은)가 이것을 구현했다고 생각합니다.
l_39217_l

겹치지 만 사각형 안에 모서리가없는 경우를 놓칠 수 있습니다.
Florian Bösch

1
이 질문은 stackoverflow.com/questions/306316/… 과 거의 동일 합니다. 그러나 이것은 특히 C ++을위한 솔루션을 찾고 있습니다. 허용되는 답변도 매우 간단하고 간단합니다.
실버 곤잘레스

답변:


162

표준 방법은 분리 축 테스트를 수행하는 것입니다 (Google 검색을 수행하십시오).

한마디로 :

  • 두 객체를 분리하는 선을 찾을 수 있으면 두 객체가 교차하지 않습니다. 예를 들어, 객체의 객체 / 모든 포인트는 선의 다른면에 있습니다.

재미있는 점은 두 사각형의 모든 가장자리를 확인하는 것으로 충분하다는 것입니다. 사각형이 겹치지 않으면 가장자리 중 하나가 분리 축이됩니다.

2D에서는 경사를 사용하지 않고도이 작업을 수행 할 수 있습니다. 가장자리는 단순히 두 꼭짓점의 차이로 정의됩니다. 예 :

  edge = v(n) - v(n-1)

90도 회전시켜 수직을 얻을 수 있습니다. 2D에서는 다음과 같이 쉽습니다.

  rotated.x = -unrotated.y
  rotated.y =  unrotated.x

삼각법이나 경사가 없습니다. 벡터를 단위 길이로 정규화 할 필요도 없습니다.

점이 선의 한쪽 또는 다른쪽에 있는지 테스트하려면 내적을 사용할 수 있습니다. 표지판은 당신이 어느쪽에 있는지 알려줍니다 :

  // rotated: your rotated edge
  // v(n-1) any point from the edge.
  // testpoint: the point you want to find out which side it's on.

  side = sign (rotated.x * (testpoint.x - v(n-1).x) + 
               rotated.y * (testpoint.y - v(n-1).y);

이제 사각형 A의 모든 점을 사각형 B의 가장자리와 반대로 테스트하십시오. 분리되는 모서리를 찾으면 물체가 교차하지 않습니다 (B의 다른 모든 점이 테스트중인 모서리의 다른쪽에있는 경우 아래 그림 참조). 분리 모서리가 없으면 직사각형이 교차하거나 하나의 직사각형이 다른 직사각형에 포함됩니다.

이 테스트는 볼록 다각형 btw ..

수정 : 분리 에지를 식별하기 위해 한 직사각형의 모든 포인트를 다른 에지의 각 에지에 대해 테스트하는 것만으로는 충분하지 않습니다. 후보 에지 E (아래)는 A의 모든 점이 E의 동일한 반평면에 있으므로 분리 에지로 식별됩니다. 그러나 B의 정점 Vb1 및 Vb2 때문에 분리 에지가 아닙니다. 그 반평면에도 있습니다. 그렇지 않은 경우에만 분리 된 가장자리 였을 것입니다 http://www.iassess.com/collision.png


2
이 알고리즘은 모든 경우에 작동하지 않습니다. 45도 회전 한 두 번째 사각형을 첫 번째 사각형에 놓고 대각선을 따라 오프셋하여 위의 교차 테스트를 수행하지만 교차하지는 않을 수 있습니다.
Skizz

6
Skizz, 8 개의 가장자리를 모두 확인하십시오. 개체가 8 개의 가장자리 중 하나와 교차하지 않으면 개체 분리됩니다. 사례를 보여주는 이미지를 게시하지 않으시겠습니까? 나는 당신에게 축을 보여줄 수 있습니다 ..
Nils Pipenbrinck

2
내 실수는 그 조건에 대처하는 것입니다.
Skizz

2
이미지는 지금 죽었다 (2012 년
John Dvorak

2
나는 이것을 시각화하는 데 많은 어려움을 겪었으므로 참조되는 이미지가 어떻게 보이는지 다시 생각했습니다. imgur.com/bNwrzsv
Rjdlee 2016 년

16

기본적으로 다음 그림을보십시오.


두 상자가 충돌하면 선 A와 B가 겹칩니다.

이 작업은 X 축과 Y 축 모두에서 수행해야하며 사각형이 충돌하려면 겹치게해야합니다.

gamasutra.com 에는 질문에 대한 답변 이있는 좋은 기사가 있습니다 (사진은 기사에 있음). 5 년 전에 비슷한 알고리즘을 수행했으며 나중에 여기에 게시 할 코드 스 니펫을 찾아야합니다

개정 : 분리 축 정리 개의 볼록 형상한다고 하지 오버랩 분액 축이 존재하는 경우 (도시 된 바와 같이 돌기 즉 하나 하지 중첩). 따라서 "분리 축이 존재합니다"=> "겹침 없음". 이것은 이중의 의미가 아니므로 대화를 결론 지을 수 없습니다.


1
분명히, 두 정사각형 (0,0,1,1)과 (0,3,1,4)는 겹치지 않지만 x 축의 투영은 완전히 겹칩니다. 두 테스트가 모두 필요하며 조합으로 충분합니다.
MSalters

18
x 및 y 투영이 겹치는 것으로 충분하지 않습니다. 예를 들어 사각형 [(0,0), (0,3), (3,3), (3,0)] 및 [(2,5) (5,2), (7,4), (4,7)].
Joel in Gö

4
Gö의 @Joel에 동의합니다. 이 방법은 사각형이 겹치지 않지만 투영 된 반지름이 x와 y에서 모두 발생하는 큰 경우를 놓칩니다.
Scottie T

5
이 답변은 틀린 것이 아니지만 오해의 소지가 있습니다. 두 상자가 충돌하면 선 A와 B가 겹치게됩니다. 선 A와 B의 중복, 두 개의 상자 또는 충돌하지 않을 수 있습니다 경우 :하지만 것 또한 사실입니다
매트가 타

7
@floater : 나는 말할 것 뿐만 아니라 잘못,하지만 또한 더 악화되는, 오해의 소지가.
BlueRaja-대니 Pflughoeft

4

m_pGladiator의 답변이 옳으며 선호합니다. 분리 축 테스트 는 사각형 겹침을 감지하는 가장 단순하고 표준적인 방법입니다. 투영 간격이 겹치지 않는 선을 분리 축 이라고합니다 . Nils Pipenbrinck의 솔루션이 너무 일반적입니다. 사용도트 제품 을 하여 한 모양이 다른 가장자리의 한쪽에 완전히 있는지 여부를 확인합니다. 이 솔루션은 실제로 n-edge 볼록 다각형을 유도 할 수 있습니다. 그러나 두 사각형에는 최적화되지 않았습니다.

m_pGladiator의 대답의 핵심은 두 축 (x와 y)에서 두 개의 직사각형 투영을 확인해야한다는 것입니다. 두 개의 투영이 겹치면이 두 사각형이 겹쳤다 고 말할 수 있습니다. 따라서 m_pGladiator의 답변에 대한 위의 의견은 잘못되었습니다.

간단한 상황에서 두 개의 사각형이 회전하지 않으면 구조가있는 사각형이 나타납니다.

struct Rect {
    x, // the center in x axis
    y, // the center in y axis
    width,
    height
}

직사각형 A, B의 이름을 rectA, rectB로 지정합니다.

    if Math.abs(rectA.x - rectB.x) < (Math.abs(rectA.width + rectB.width) / 2) 
&& (Math.abs(rectA.y - rectB.y) < (Math.abs(rectA.height + rectB.height) / 2))
    then
        // A and B collide
    end if

두 사각형 중 하나가 회전되면 x 및 y 축에서 사각형의 투영을 결정하기 위해 약간의 노력이 필요할 수 있습니다. 다음과 같이 struct RotatedRect를 정의하십시오.

struct RotatedRect : Rect {
    double angle; // the rotating angle oriented to its center
}

차이점은 너비 '가 이제 약간 다른 방법입니다. rectA의 경우 Math.sqrt(rectA.width*rectA.width + rectA.height*rectA.height) * Math.cos(rectA.angle) widthA': rectB의 경우 widthB ':Math.sqrt(rectB.width*rectB.width + rectB.height*rectB.height) * Math.cos(rectB.angle)

    if Math.abs(rectA.x - rectB.x) < (Math.abs(widthA' + widthB') / 2) 
&& (Math.abs(rectA.y - rectB.y) < (Math.abs(heightA' + heightB') / 2))
    then
        // A and B collide
    end if

GDC (Game Development Conference 2007) PPT www.realtimecollisiondetection.net/pubs/GDC07_Ericson_Physics_Tutorial_SAT.ppt를 참조 할 수 있음


음의 너비를 처리하기 위해 "Math.abs (rectA.width + rectB.width)"에 Math.abs ()가 필요한 이유는 무엇입니까?
AlexWien

분리 축은 반드시 나침반 방향 일 필요는 없으며 어떤 각도도 가질 수 있습니다.
Ben Voigt

회전하지 않은 사각형 rectA (x = 0, y = 0, width = 1, height = 1) 및 rectB (x = 2, y = 0, width = 100, height = 1)는 교차하지 않지만 메서드는 교차합니다. 내가 뭔가 잘못하고 있습니까?
Kagami Sascha Rosylight

4

Cocoa에서는 selectedArea rect가 회전 된 NSView의 frame rect와 교차하는지 여부를 쉽게 감지 할 수 있습니다. 다각형, 법선 등을 계산할 필요조차 없습니다. NSView 서브 클래스에 이러한 메소드를 추가하십시오. 예를 들어, 사용자는 NSView 슈퍼 뷰에서 영역을 선택한 다음 selectedArea rect를 전달하는 DoesThisRectSelectMe 메소드를 호출합니다. API convertRect :가 해당 작업을 수행합니다. NSView를 클릭하여 선택하면 동일한 트릭이 작동합니다. 이 경우 단순히 아래와 같이 hitTest 메소드를 대체하십시오. API convertPoint : 해당 작업을 수행합니다. ;-)

- (BOOL)DoesThisRectSelectMe:(NSRect)selectedArea
{
    NSRect localArea = [self convertRect:selectedArea fromView:self.superview];

    return NSIntersectsRect(localArea, self.bounds);
}


- (NSView *)hitTest:(NSPoint)aPoint
{
    NSPoint localPoint = [self convertPoint:aPoint fromView:self.superview];
    return NSPointInRect(localPoint, self.bounds) ? self : nil;
}

2
이 코드는 화면에 사각형 인 사각형에만 작동합니다. 사소한 경우입니다. 우리는 화면 또는 서로 90도 각도가 아닌 사각형을 처리한다고 가정합니다.
Duncan C

응용 프로그램에서 확인하고 사용 했으므로 해당 코드는 회전 된 사각형에서 작동합니다. 회전 각도에 관계없이.
Leonardo

이것은 알고리즘을 설명하지는 않지만 이미 알고리즘을 사용하는 라이브러리 만 언급합니다.
Ben Voigt

2

한 사각형의 선이 다른 사각형의 선과 교차하는지 확인하십시오. 순진한 선분 교차점을 쉽게 코딩 할 수 있습니다.

더 빠른 속도가 필요한 경우 선분 교차점 (스윕 라인)을위한 고급 알고리즘이 있습니다. http://en.wikipedia.org/wiki/Line_segment_intersection을 참조하십시오


4
꼼꼼한! 하나의 사각형이 다른 사각형을 완전히 둘러싸는 경우를 잊지 마십시오
Pitarou

2

하나의 해결책은 No Fit Polygon이라는 것을 사용하는 것입니다. 이 다각형은 두 개의 다각형 (개념적으로 하나를 다른 주위로 미끄러짐)으로 계산되며 다각형이 상대 오프셋을 기준으로 겹치는 영역을 정의합니다. 이 NFP가 있으면 두 다각형의 상대 오프셋으로 지정된 점으로 포함 테스트를 수행하면됩니다. 이 포함 테스트는 빠르고 쉽습니다. 먼저 NFP를 만들어야합니다.

웹에서 No Fit Polygon을 검색하고 볼록 다각형에 대한 알고리즘을 찾을 수 있는지 확인하십시오 (오목 다각형이 있으면 훨씬 복잡해집니다). 아무것도 찾을 수 없다면 howard dot J dot에서 gmail dot com으로 이메일을 보내주십시오.


1

다음은 가능한 모든 사례를 처리 할 것이라고 생각합니다. 다음 테스트를 수행하십시오.

  1. 사각형 1의 꼭짓점은 사각형 2 안에 있고 그 반대도 마찬가지입니다. 다른 사각형 안에있는 정점을 찾을 때마다 검색과 교차하고 중지한다고 결론을 내릴 수 있습니다. 하나의 사각형이 다른 사각형 안에 완전히 들어갑니다.
  2. 위의 테스트가 결정적이지 않으면 1 직사각형의 각 라인과 다른 직사각형의 각 라인의 교차점을 찾으십시오. 교차점이 발견되면 해당 4 점에 의해 생성 된 가상의 사각형 내부에 있는지 확인하십시오. 그러한 요점이 발견되면 그것들이 교차하고 검색을 중단한다는 결론을 내립니다.

위의 두 테스트에서 false를 반환하면이 두 사각형이 겹치지 않습니다.


0

Java를 사용하는 경우 Shape 인터페이스의 모든 구현 에는 사각형을 사용 하는 교차 메소드가 있습니다.


불행히도 나는 C #을 사용하고 있습니다. Rectangle 클래스에는 Contains () 메서드가 있지만 회전되지 않은 사각형에만 해당됩니다.
user20493

intersects () 메소드는 교차점 대신 부울을 반환하기 때문에 꽤 쓸모가 없습니다.
ZZ 5

0

무차별 강제 방법은 가로 사각형의 가장자리를 걷고 가장자리를 따라 각 점을 확인하여 다른 사각형에 있는지 또는 다른 사각형에 있는지 확인하는 것입니다.

수학적 답은 두 직사각형의 각 모서리를 설명하는 방정식을 형성하는 것입니다. 이제 사각형 A의 4 개의 선 중 하나가 사각형 B의 선과 교차하는지 간단히 알 수 있습니다. 이는 간단한 (빠른) 선형 방정식 솔버 여야합니다.

-아담


2
방정식의 문제는 무한 경사가있는 세로선이있을 때입니다.
user20493

모든 솔루션에 대한 코너 케이스가 있습니다.
Adam Davis

2
하나의 사각형이 다른 사각형을 완전히 둘러싸고 있습니다.
Oliver Hallam

0

각이 진 사각형의 각면과 축이 정렬 된 각면의 교차점을 찾을 수 있습니다. 각 변이 위치하는 무한 선의 방정식 (예 : v1 + t (v2-v1) 및 v'1 + t '(v'2-v'1))을 찾아서 선은 두 방정식이 같을 때 t를 풀고 (해당하는 경우 테스트 할 수 있음) 해당 점이 두 정점 사이의 선분에 있는지 여부를 테스트합니다. 즉, 0 <= t <= 1 및 0 <= t '<= 1.

그러나 한 직사각형이 다른 직사각형을 완전히 덮는 경우에는 적용되지 않습니다. 직사각형의 네 점이 모두 다른 직사각형 안에 있는지 테스트하여 커버 할 수 있습니다.


0

이것이 제가 3D를 위해 할 것입니다 문제 버전에 과 같이하십시오.

두 개의 직사각형을 방정식 P1 및 P2에 의해 설명 된 평면으로 모델링 한 다음 P1 = P2를 작성하고 그 평면에서 평행하거나 교차하지 않는 경우 존재하지 않는 교차 방정식의 선에서 파생됩니다. 이 경우 0 = 0이됩니다. 이 경우 2D 직사각형 교차 알고리즘을 사용해야합니다.

그런 다음 두 사각형의 평면에있는 그 선이 두 사각형을 통과하는지 확인합니다. 그렇다면 2 개의 직사각형이 교차하고 그렇지 않으면 그렇지 않습니다 (그렇지 않으면 머리에 모서리가 빠졌을 수 있습니다).

선이 동일한 평면에서 사각형을 통과하는지 확인하려면 선과 사각형의 측면의 두 교차점을 찾아 (선 방정식을 사용하여 모델링) 교차점이 점과 범위.

그것은 수학적 설명입니다. 불행히도 위의 작업을 수행 할 코드가 없습니다.


평면형 교차 선을 찾은 경우 그 부분이 두 사각형 안에 있는지 확인해야합니다.
Lee Louviere

0

- 약간 빠른 분리 축 테스트를 사용하는 것보다 테스트를 할 수있는 또 다른 방법은, 사분면에 (권선 번호 알고리즘 만 사용하는 것입니다 하지 엄청 시리 느린 각도 합계)을 두 사각형의 각 꼭지점에 (임의로 선택). 정점이 0이 아닌 굴곡 수를 가지면 두 사각형이 겹칩니다.

이 알고리즘은 분리 축 테스트보다 다소 오래 걸리지 만 가장자리가 두 개의 사분면을 가로 지르는 경우 반 평면 테스트 만 필요하므로 분리 속도가 빠릅니다 (분리 축 방법을 사용하는 최대 32 개의 테스트와 반대)

이 알고리즘은 모든 다각형 (볼록 또는 오목)의 겹침을 테스트하는 데 사용할 수 있다는 이점이 있습니다 . 내가 아는 한, 알고리즘은 2D 공간에서만 작동합니다.


3
틀릴 수도 있지만 한 사각형의 꼭짓점이 다른 사각형 안에 있는지 확인하지는 않습니까? 그렇다면 사각형이 정점없이 겹칠 수 있기 때문에 충분하지 않습니다.
sinelaw

직사각형으로도 가능합니까? 어떻게? 2 개의 직사각형이 교차하기 위해서는 직사각형 중 하나의 적어도 하나의 꼭지점이 다른 직사각형에 놓여 있어야합니다.
Duncan C

@ DuncanC : 그렇습니다. 반대의 예는 십자가이며, 원래 질문에 나열되어 있습니다.
Ben Voigt

@ BenVoigt 이것은 매우 오래된 스레드이지만 당신은 절대적으로 맞습니다.
Duncan C

0

왜 내가 이것을 복잡하게 만드는 다른 것을 놓치고 있습니까?

(x1, y1) 및 (X1, Y1)이 사각형의 모서리 인 경우 교차점을 찾으려면 다음을 수행하십시오.

    xIntersect = false;
    yIntersect = false;
    if (!(Math.min(x1, x2, x3, x4) > Math.max(X1, X2, X3, X4) || Math.max(x1, x2, x3, x4) < Math.min(X1, X2, X3, X4))) xIntersect = true;
    if (!(Math.min(y1, y2, y3, y4) > Math.max(Y1, Y2, Y3, Y4) || Math.max(y1, y2, y3, y4) < Math.min(Y1, Y2, Y3, Y4))) yIntersect = true;
    if (xIntersect && yIntersect) {alert("Intersect");}

3
당신은 그가 임의의 각도로 회전하기를 원하지 않습니다.
Robotbugs

0

나는 이것을 다음과 같이 구현했다.

bool rectCollision(const CGRect &boundsA, const Matrix3x3 &mB, const CGRect &boundsB)
{
    float Axmin = boundsA.origin.x;
    float Axmax = Axmin + boundsA.size.width;
    float Aymin = boundsA.origin.y;
    float Aymax = Aymin + boundsA.size.height;

    float Bxmin = boundsB.origin.x;
    float Bxmax = Bxmin + boundsB.size.width;
    float Bymin = boundsB.origin.y;
    float Bymax = Bymin + boundsB.size.height;

    // find location of B corners in A space
    float B0x = mB(0,0) * Bxmin + mB(0,1) * Bymin + mB(0,2);
    float B0y = mB(1,0) * Bxmin + mB(1,1) * Bymin + mB(1,2);

    float B1x = mB(0,0) * Bxmax + mB(0,1) * Bymin + mB(0,2);
    float B1y = mB(1,0) * Bxmax + mB(1,1) * Bymin + mB(1,2);

    float B2x = mB(0,0) * Bxmin + mB(0,1) * Bymax + mB(0,2);
    float B2y = mB(1,0) * Bxmin + mB(1,1) * Bymax + mB(1,2);

    float B3x = mB(0,0) * Bxmax + mB(0,1) * Bymax + mB(0,2);
    float B3y = mB(1,0) * Bxmax + mB(1,1) * Bymax + mB(1,2);

    if(B0x<Axmin && B1x<Axmin && B2x<Axmin && B3x<Axmin)
        return false;
    if(B0x>Axmax && B1x>Axmax && B2x>Axmax && B3x>Axmax)
        return false;
    if(B0y<Aymin && B1y<Aymin && B2y<Aymin && B3y<Aymin)
        return false;
    if(B0y>Aymax && B1y>Aymax && B2y>Aymax && B3y>Aymax)
        return false;

    float det = mB(0,0)*mB(1,1) - mB(0,1)*mB(1,0);
    float dx = mB(1,2)*mB(0,1) - mB(0,2)*mB(1,1);
    float dy = mB(0,2)*mB(1,0) - mB(1,2)*mB(0,0);

    // find location of A corners in B space
    float A0x = (mB(1,1) * Axmin - mB(0,1) * Aymin + dx)/det;
    float A0y = (-mB(1,0) * Axmin + mB(0,0) * Aymin + dy)/det;

    float A1x = (mB(1,1) * Axmax - mB(0,1) * Aymin + dx)/det;
    float A1y = (-mB(1,0) * Axmax + mB(0,0) * Aymin + dy)/det;

    float A2x = (mB(1,1) * Axmin - mB(0,1) * Aymax + dx)/det;
    float A2y = (-mB(1,0) * Axmin + mB(0,0) * Aymax + dy)/det;

    float A3x = (mB(1,1) * Axmax - mB(0,1) * Aymax + dx)/det;
    float A3y = (-mB(1,0) * Axmax + mB(0,0) * Aymax + dy)/det;

    if(A0x<Bxmin && A1x<Bxmin && A2x<Bxmin && A3x<Bxmin)
        return false;
    if(A0x>Bxmax && A1x>Bxmax && A2x>Bxmax && A3x>Bxmax)
        return false;
    if(A0y<Bymin && A1y<Bymin && A2y<Bymin && A3y<Bymin)
        return false;
    if(A0y>Bymax && A1y>Bymax && A2y>Bymax && A3y>Bymax)
        return false;

    return true;
}

행렬 mB는 B 공간의 점을 A 공간의 점으로 변환하는 아핀 변환 행렬입니다. 여기에는 단순한 회전 및 평행 이동, 회전 더하기 크기 조정 및 완전한 아핀 왜곡이 포함되지만 원근 왜곡은 포함되지 않습니다.

가능한 최적이 아닐 수 있습니다. 속도는 큰 관심사가 아니었다. 그러나 그것은 나를 위해 잘 작동하는 것 같습니다.


0

허용되는 답변의 matlab 구현은 다음과 같습니다.

function olap_flag = ol(A,B,sub)

%A and B should be 4 x 2 matrices containing the xy coordinates of the corners in clockwise order

if nargin == 2
  olap_flag = ol(A,B,1) && ol(B,A,1);
  return;
end

urdl = diff(A([1:4 1],:));
s = sum(urdl .* A, 2);
sdiff = B * urdl' - repmat(s,[1 4]);

olap_flag = ~any(max(sdiff)<0);

0

이것은 일반적인 방법입니다. 한 줄씩 이동하고 선이 교차하는지 확인하십시오. 이것은 MATLAB의 코드입니다.

C1 = [0, 0];    % Centre of rectangle 1 (x,y)
C2 = [1, 1];    % Centre of rectangle 2 (x,y)
W1 = 5; W2 = 3; % Widths of rectangles 1 and 2
H1 = 2; H2 = 3; % Heights of rectangles 1 and 2
% Define the corner points of the rectangles using the above
R1 = [C1(1) + [W1; W1; -W1; -W1]/2, C1(2) + [H1; -H1; -H1; H1]/2];
R2 = [C2(1) + [W2; W2; -W2; -W2]/2, C2(2) + [H2; -H2; -H2; H2]/2];

R1 = [R1 ; R1(1,:)] ;
R2 = [R2 ; R2(1,:)] ;

plot(R1(:,1),R1(:,2),'r')
hold on
plot(R2(:,1),R2(:,2),'b')


%% lines of Rectangles 
L1 = [R1(1:end-1,:) R1(2:end,:)] ;
L2 = [R2(1:end-1,:) R2(2:end,:)] ;
%% GEt intersection points
P = zeros(2,[]) ;
count = 0 ;
for i = 1:4
    line1 = reshape(L1(i,:),2,2) ;
    for j = 1:4
        line2 = reshape(L2(j,:),2,2) ;
        point = InterX(line1,line2) ;
        if ~isempty(point)
            count = count+1 ;
            P(:,count) = point ;
        end
    end
end
%%
if ~isempty(P)
    fprintf('Given rectangles intersect at %d points:\n',size(P,2))
    plot(P(1,:),P(2,:),'*k')
end

InterX 기능은 https://in.mathworks.com/matlabcentral/fileexchange/22441-curve-intersections?focused=5165138&tab=function 에서 다운로드 할 수 있습니다.


0

직사각형이 2 개인 경우 더 간단한 방법이 있습니다.

R1 = (min_x1, max_x1, min_y1, max_y1)

R2 = (min_x2, max_x2, min_y2, max_y2)

다음과 같은 경우에만 겹칩니다.

오버랩 = (max_x1> min_x2) 및 (max_x2> min_x1) 및 (max_y1> min_y2) 및 (max_y2> min_y1)

3D 상자에서도 가능하며 실제로는 여러 치수에서 작동합니다.


0

다른 답변에서 충분히 언급되었으므로 의사 코드 한 줄짜리를 추가합니다.

!(a.left > b.right || b.left > a.right || a.top > b.bottom || b.top > a.bottom);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.