주어진 점 좌표 세트에서 경계 좌표를 찾으십니까?


18

좌표가 주어지면 경계 좌표를 어떻게 찾을 수 있습니까?
좌표 세트 <== 그림 1
위의 세트에 좌표가 주어지면 어떻게 빨간색 경계에서 좌표를 얻을 수 있습니까? 경계는 정점에 대한 입력 좌표로 면적을 최대화하는 방식으로 형성되는 다각형입니다.

도시 의 'x'마일 이내에 속성을 검색하는 앱을 개발 중 입니다 . 내가 가진 것은 :

  1. 모든 속성의 좌표
  2. 각 도시에 대한 좌표 세트 (지퍼마다 하나의 좌표가 있습니다. 대부분의 도시에는 하나 이상의 지퍼가 있으므로 모든 도시에는 좌표 세트가 있습니다)

최대 영역을 요구하는 이유 는 다음과 같은 다각형을 만들지 않기 때문입니다.

비뚤어진 다각형 <== 그림 2

내가 필요한 것은 경계에 대한 좌표 세트를 생각해 내는 알고리즘 입니다. 그림 1에 대한 경계 좌표를 얻을 수있는 알고리즘 .



4
아니, 복제하지, 이것은 오목 볼록 선체입니다
Nicklas Avén

1
기존의 특정 소프트웨어 환경에서 코드, 이론적 참조 또는 솔루션을 찾고 있습니까?
WolfOdrade

1
@Khaja 아니요, 면적을 최대화하고 싶지 않으며 점을 포함하는 모든 볼록 다각형 중에서 면적을 최소화 하고 싶습니다 . (지역을 최대화하는 유일한 방법은 전 세계를 포함하는 다각형으로 사용하는 것입니다.)
whuber

1
@ whuber 그래, 이제 무슨 말인지 알 겠어, 최소 면적의 볼록 다각형이 필요하다. 나의 궁극적 인 목표는 근접 검색을하는 것입니다. 근접 검색이 작동하는 방식은 다음과 같습니다. 특정 도시 (볼록 선체)에서 "x"마일 이내에 집 (각 가정에 좌표가 있음)을 검색하면, 그 안에있는 모든 이 나에게 있어야 합니다. 볼록 껍질 또는 "x"마일 미만의 직교 거리
Khaja Minhajuddin

답변:


21

이 문제를 해결하기위한 많은 알고리즘이 있습니다 ( Wikipedia "Convex_hull_algorithms" ).

  • 선물 포장 일명 Jarvis march — O (nh) : 가장 간단한 알고리즘 중 하나입니다. 시간 복잡도는 O (nh)이며 여기서 n은 집합의 포인트 수이고 h는 선체의 포인트 수입니다. 최악의 경우 복잡도는 O (n2)입니다.
  • Graham scan — O (n log n) : 약간 더 정교하지만 훨씬 효율적인 알고리즘입니다. 점이 이미 좌표 중 하나 또는 고정 벡터에 대한 각도로 정렬 된 경우 알고리즘은 O (n) 시간이 걸립니다. [ 의사 코드 ]
  • QuickHull : quicksort 알고리즘과 마찬가지로 O (n log n)의 예상 시간 복잡도를 갖지만 최악의 경우 O (nh) = O (n2)로 저하 될 수 있습니다. [ 예시 설명 ]
  • 나누기 및 정복 — O (n log n) : 이 알고리즘은 3 차원 경우에도 적용 할 수 있습니다.
  • 모노톤 체인 — O (n log n) : 점을 사전 순으로 좌표를 정렬하는 Graham 스캔의 변형입니다. 입력이 이미 정렬 된 경우 알고리즘은 O (n) 시간이 걸립니다.
  • 증분 볼록 껍질 알고리즘 — O (n log n)
  • 정복 전 결혼 — O (n log h) : 최적의 출력 감지 알고리즘.
  • Chan의 알고리즘 — O (n log h) : 더 간단한 최적 출력 감지 알고리즘.

@underdark ...를 나열 해 주셔서 감사합니다. 어느 것이 당신의 선택입니까?
Marin



3

당신이 원하는 것은 볼록 껍질입니다. PostGIS에는 볼록 껍질 ST_ConvexHull (geometry) 를 제공하는 기능 (실제로는 GEOS)이 있습니다 .

Wikipedia에는 ​​오목 선체에 대한 많은 정보가 있습니다.


1

알고리즘을 수행 할 수있는 패키지가 아닌 알고리즘을 원한다면 데이터를 삼각 측량해야한다고 생각합니다. 기본적으로 각 점에서 다른 점으로 선을 정의합니다. 그런 다음 Y 값이 가장 높은 지점부터 시작하여 외부 선 / 베어링이 가장 작은 연결된 선을 따라 외부 주변 경로를 추적합니다.

교차하는 선을 먼저 버려서 추적 속도를 높일 수 있습니다. 외부 경계에는 교차점이 없습니다.

btw-FME는 ConvexHullAccumulator 또는 ConvexHullReplacer 변압기에서도이 작업을 수행합니다!


1

코드로 구현 된 기존 알고리즘을보고 싶은 경우 NetTopologySuite는이를 수행하는 알고리즘을 가지고 있습니다.

ConvexHull.cs 참조

우연히 NTS와 다른 많은 라이브러리는 DotSpatial이라는 멋진 프로젝트에 싸여 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.