이것은 아주 좋은 질문입니다. 얼마 전에 C #에서 동일한 알고리즘을 구현했습니다. 알고리즘은 두 다각형의 공통 윤곽을 구성합니다 (즉, 구멍없이 결합을 구성합니다). 여기있어.
1 단계. 다각형을 설명하는 그래프를 만듭니다.
입력 : 첫 번째 다각형 (n 포인트), 두 번째 다각형 (m 포인트). 출력 : 그래프. 정점-다각형 교차점.
교차로를 찾아야합니다. 두 다각형 [O (n * m)]의 모든 다각형면을 반복하고 교차점을 찾습니다.
교차점이 없으면 정점을 추가하고 가장자리에 연결하기 만하면됩니다.
교차점이 발견되면 길이별로 시작점까지 정렬하고 모든 꼭지점 (시작, 끝 및 교차점)을 추가 한 다음 (이미 정렬 된 순서대로) 가장자리에 연결합니다.
2 단계. 구성된 그래프 확인
그래프를 만들 때 교차점을 찾지 못한 경우 다음 조건 중 하나가 있습니다.
- Polygon1에 polygon2가 포함됨-polygon1 반환
- Polygon2에는 polygon1이 포함되어 있습니다-polygon2 반환
- Polygon1과 polygon2는 교차하지 않습니다. 다각형 1과 다각형 2를 반환합니다.
3 단계. 왼쪽 아래 꼭지점을 찾습니다.
최소 x 및 y 좌표 (minx, miny)를 찾습니다. 그런 다음 (minx, miny)와 다각형 점 사이의 최소 거리를 찾으십시오. 이 지점은 왼쪽 하단 지점이됩니다.
4 단계. 공통 윤곽을 만듭니다.
왼쪽 하단 지점에서 그래프를 횡단하고 다시 들어갈 때까지 계속합니다. 처음에는 모든 모서리를 방문하지 않은 것으로 표시합니다. 반복 할 때마다 다음 지점을 선택하고 방문한 것으로 표시해야합니다.
다음 점을 선택하려면 시계 반대 방향으로 최대 내부 각도가있는 모서리를 선택합니다.
두 벡터를 계산합니다 : 현재 가장자리에 대해 vector1과 다음 방문하지 않은 각 가장자리에 대해 vector2 (그림 참조).
벡터의 경우 다음을 계산합니다.
- 스칼라 곱 (내적). 벡터 사이의 각도와 관련된 값을 반환합니다.
- 벡터 곱 (교차 곱). 새로운 벡터를 반환합니다. 이 벡터의 z 좌표가 양수이면 스칼라 곱은 시계 반대 방향으로 직각을 제공합니다. 그렇지 않으면 (z 좌표가 음수 임) 벡터 사이의 각도를 스칼라 곱에서 360 각도로 계산합니다.
결과적으로 최대 각도를 가진 가장자리 (및 해당 다음 정점)를 얻습니다.
전달 된 각 정점을 결과 목록에 추가합니다. 결과 목록은 유니온 폴리곤입니다.
비고
- 이 알고리즘을 사용하면 여러 다각형을 병합하여 다각형 쌍을 반복적으로 적용 할 수 있습니다.
- 많은 베 지어 곡선과 선으로 구성된 경로가있는 경우 먼저이 경로를 병합해야합니다.