한 다각형에 다른 다각형이 완전히 포함되어 있는지 어떻게 확인합니까?


9

다각형이 2 개 있습니다. 두 다각형의 꼭짓점 좌표를 알고 있습니다. 하나가 다른 하나 안에 완전히 있는지 확인하는 가장 좋은 방법은 무엇입니까? 예를 들어, 알고리즘은 아래 의 검은 사다리꼴 만 포함 된 것으로 인식해야합니다 .

다각형 예


지금 당장 자세한 대답을 할 수는 없지만 나중에 충돌 감지를위한 분리 축 정리의 구현을 살펴보아야합니다. 알고리즘을 약간 수정하여 원하는 것을 쉽게 확인할 수 있습니다. 예 : codezealot.org/archives/55
TravisG

1
다각형 내부의 다각형에 대해 정확히 이해하고 있지 않습니다. 더 작은 다각형의 모든 점이 더 큰 다각형에 있지만 각각의 선이 한 줄에 있고 서로 붙어 있습니까? i47.tinypic.com/4i0sgg.jpg
speedyGonzales

@speedyGonzales, 이것은 내부라고 불리는 alos입니다.
user960567

답변:


5

" 다각형 내부 점 "에 대한 테스트를 수행하는 메소드에 대한 수많은 소스 스 니펫이 있습니다 . 이 원칙은 다각형에 대한 요르단 곡선 정리 ( http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Octavian/compgeom.html ) 에서 비롯됩니다 .

순진한 방법은 다음과 같습니다. 해당 메소드를 호출하십시오 PointInsidePolygon(Point p, Polygon poly).

  bool isInside = true;
  for each (Point p in innerPoly)
  {
    if (!PointInsidePolygon(p, outerPoly))
    {
      isInside = false; // at least one point of the innerPoly is outside the outerPoly
      break;
    }
  }
  if (!isInside) return false;
  // COMPULSORY EDGE INTERSECTION CHECK
  for each (innerEdge in innerPoly)
    for each (outerEdge in outerPoly)
    {
      if (EdgesIntersect(innerEdge, outerEdge))
      {
        isInside = false;
        break;
      }
    }

  return isInside;

이론적으로 다각형에 대한 시나리오를 놓치지 않아야하지만 최적의 솔루션은 아닙니다.

"가장자리"사례 비고

  • PointInsidePolygon(..) 점이 다각형의 경계에 있으면 (가장자리에 있거나 정점 인 경우) true를 반환해야합니다.

  • EdgesIntersect(..)innerEdge이 (의 기하학적) 하위 집합 인 경우 false를 반환해야 합니다 outerEdge. 이 경우 모서리가 분명히 교차하지만 알고리즘의 목적을 위해 교차로가 isInside변수 뒤의 의미를 파괴하지 않음을 나타내야합니다.

일반 리 마커 :

  • 주석에서 지적한 바와 같이 모서리 대 모서리 교차점 검사가 없으면 접근 방식은 일부 오목 다각형 (예 : V 자형 사각형 및 사각형)에 대해 오탐 (false positive)을 반환 할 수 있습니다-사각형은 V 모양 안에 정점이 모두 있지만 교차합니다 따라서 외부에 적어도 일부 영역이 있음).

  • 내부 다각형의 정점 중 하나 이상이 외부 다각형 내부에 있는지 확인한 후 교차하는 모서리가 없으면 탐색 조건이 충족되었음을 의미합니다.


1
외부 다각형이 오목하면 오 탐지를 반환합니다.
sam hocevar

2
재미있게도 teodron과 knight666은 개별적으로 잘못되었지만 결합하면 올바른 대답을해야합니다. 다각형의 모든 점이 다른 점 안에 있고 선이 교차하지 않으면 첫 번째 폴리가 다른 것 안에 완전히있게됩니다.
Hackworth

사실, 오 탐지를 반환하므로 에지 교차점도 고려해야합니다.
teodron 2016 년

이것은 정답 인 것 같습니다. 두 번째 루프 조건을 확인할 필요가 없다고 생각합니다.
user960567

끝점 교차점이나 가장자리가 겹치는 경우에는 작동하지 않습니다.
Brandon Kohn

2

각 빨간색 선과 교차하는 선을 시도하십시오. 의사 코드에서 :

// loop over polygons
for (int i = 0; i < m_PolygonCount; i++)
{
    bool contained = false;

    for (int j = 0; j < m_Polygon[i].GetLineCount(); j++)
    {
        for (int k = 0; k < m_PolygonContainer.GetLineCount(); k++)
        {
            // if a line of the container polygon intersects with a line of the polygon
            // we know it's not fully contained
            if (m_PolygonContainer.GetLine(k).Intersects(m_Polygon[i].GetLine(j)))
            {
                contained = false;
                break;
            }
        }

        // it only takes one intersection to invalidate the polygon
        if (!contained) { break; }
    }

    // here contained is true if the polygon is fully inside the container
    // and false if it's not
}

그러나보다시피 확인할 다각형을 추가하면이 솔루션이 느려집니다. 다른 해결책은 다음과 같습니다.

  • 컨테이너 다각형을 흰색의 픽셀 버퍼로 렌더링합니다.
  • 자식 다각형을 흰색의 다른 픽셀 버퍼로 렌더링합니다.
  • XOR 마스크로 다각형 버퍼 위에 컨테이너 버퍼를 마스킹하십시오.
  • 흰색 픽셀 수를 센다. 0보다 크면 하위 다각형이 컨테이너에 완전히 포함되지 않습니다.

이 솔루션은 매우 빠르지 만 구현 및 확인 결과로 수행하려는 작업에 따라 어떤 솔루션이 가장 적합한 지에 따라 다릅니다.


1
선 교차로는 충분하지 않은 다각형을 발견하기에 충분하지 않습니다.
Kylotan 2016 년

1
질문 : 다각형이 완전히 분리되어 있으면 가장자리가 교차하지 않습니다. 이 경우 작동합니까? 둘째, 그래픽 기반 접근 방식이 실제로 작동해야합니다!
teodron 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.