다각형이 2 개 있습니다. 두 다각형의 꼭짓점 좌표를 알고 있습니다. 하나가 다른 하나 안에 완전히 있는지 확인하는 가장 좋은 방법은 무엇입니까? 예를 들어, 알고리즘은 아래 의 검은 사다리꼴 만 포함 된 것으로 인식해야합니다 .
다각형이 2 개 있습니다. 두 다각형의 꼭짓점 좌표를 알고 있습니다. 하나가 다른 하나 안에 완전히 있는지 확인하는 가장 좋은 방법은 무엇입니까? 예를 들어, 알고리즘은 아래 의 검은 사다리꼴 만 포함 된 것으로 인식해야합니다 .
답변:
" 다각형 내부 점 "에 대한 테스트를 수행하는 메소드에 대한 수많은 소스 스 니펫이 있습니다 . 이 원칙은 다각형에 대한 요르단 곡선 정리 ( 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 모양 안에 정점이 모두 있지만 교차합니다 따라서 외부에 적어도 일부 영역이 있음).
내부 다각형의 정점 중 하나 이상이 외부 다각형 내부에 있는지 확인한 후 교차하는 모서리가 없으면 탐색 조건이 충족되었음을 의미합니다.
각 빨간색 선과 교차하는 선을 시도하십시오. 의사 코드에서 :
// 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
}
그러나보다시피 확인할 다각형을 추가하면이 솔루션이 느려집니다. 다른 해결책은 다음과 같습니다.
이 솔루션은 매우 빠르지 만 구현 및 확인 결과로 수행하려는 작업에 따라 어떤 솔루션이 가장 적합한 지에 따라 다릅니다.