손톱을 나무 판에 망치로 감고 고무 밴드를 감싸면 볼록 껍질이 생깁니다 .
당신의 임무는, 당신이 그것을 받아들이기로 결정한다면, 주어진 2D 포인트 세트의 볼록 껍질 을 찾는 것 입니다.
몇 가지 규칙 :
- 함수로 작성하십시오. 원하는 포인트 형식의 목록 좌표가 인수입니다.
- 출력은 시계 방향 또는 반 시계 방향으로 나열된 볼록 껍질의 지점 목록이어야합니다.
- 출력 목록은 각 점의 좌표를 명확하게 구별 할 수있는 합리적인 형식 일 수 있습니다. (예를 들어 1 개의 희미한 목록이 아님 {0.1, 1.3, 4, ...})
- 볼록 껍질 선분에서 세 개 이상의 점이 정렬되면 두 극단 만 출력에 유지되어야합니다.
샘플 데이터 :
샘플 0
입력:
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
산출:
{{3, 3}, {1, 3}, {1, 1}}
(그림은 단지 예시 일뿐입니다)
샘플 1
입력:
{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9},
{13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4},
{8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}
산출:
{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14},
{2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}
샘플 2
입력:
{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276},
{0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483},
{-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
{-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902},
{-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614},
{0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062},
{-0.930053, 0.60341}, {0.656995, 0.854205}}
산출:
{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816},
{-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994},
{-0.553528, -0.967036}}
표준 코드 골프 규칙이 적용됩니다. 임시 지오메트리 라이브러리가 없습니다. 더 짧은 코드가 승리합니다.
편집 1
여기서는 MatLab 이나 Mathematica 와 같은 볼록 껍질 파인더 사전 프로그래밍 루틴 이 아닌 알고리즘 답변을 찾고 있습니다.
편집 2
답변 의견 및 추가 정보 :
- 입력 목록에 적합한 최소 개수의 점이 포함되어 있다고 가정 할 수 있습니다. 그러나 정렬 된 (하위) 세트를 올바르게 처리해야합니다.
- 입력 목록에서 반복되는 점을 찾을 수 있습니다
- 최대 포인트 수는 사용 가능한 메모리에 의해서만 제한되어야합니다
- "부동 소수점"다시 : 샘플에 제공된 것과 같은 소수 좌표를 사용하여 입력 목록을 처리 할 수 있어야합니다. 당신은 수있는 부동 소수점 표현을 사용하여 해당 작업을 수행
.