선을 다각형으로


11

선을 다각형으로 변환 할 수있는 알고리즘의 "이름"을 찾지 못했습니다. 이 문제는 GIS와 전산 기하학 및 컴퓨터 과학 분야에 적용됩니다. 믹스에 추가 할 내용이 확실하지 않습니다. 다른 사람들이 자신의 첫 번째 검색 기준으로 고려할 사항을 알고 싶어서 검색 한 내용의 목록을 제공하는 것을 꺼려합니다.

시나리오는 ... 선이 있습니다 (선을 만드는 데 필요한 두 점) ... 각 선은 적어도 하나의 다른 선에 연결됩니다. 연결된 선 사이의 중간 공간은 다각형을 형성합니다. 가장 간단한 시나리오는 삼각형, 사각형, 다중 세그먼트 기능으로 넘어갈 수 있습니다.

막연한 설명에 대해 죄송하지만 내가 말했듯이 가능한 해결책을 이미 방문한 경로로 안내하고 싶지 않습니다. 최종 해결책만큼 "첫 번째 생각"에 관심이 있기 때문입니다.


선이 일치 할 수 있습니까? 선이 교차 할 수 있습니까? (예 : 깨끗합니까?) 그렇다면이 프로세스를 호출하면 응용 프로그램이 너무 구체적이지 않기를 바랍니다.
커크 Kuykendall

커크 일치 선과 기타 "결함"은 다각형을 구성하기 전에 제거되었을 것입니다 ... 나는 다양한 GIS 패키지 (예 : arcgis)에서 구현 된 "알고리즘 이름"을 찾으려고 노력하고 있습니다. 간단히 말해서, 모든 퇴화 조건이 처리되었고 다각형을 구성 할 수있는 노드에서 일치하는 깨끗한 선 (2 개의 점 선)이 남아 있다는 것을 고려하십시오. 핵심은 선이 존재하고 변성 조건이 없으며 중간 공간을 다각형으로 변환해야한다는 것입니다. 감사합니다

점이 평면 또는 구에 있습니까?
커크 Kuykendall

커크 ... 평면에서 구형 좌표가 아닌 미터 x, y 좌표 예를 들어, 보로 노이 다이어그램을 구성하는 선 세그먼트가 있지만이를 구성하는 세그먼트는 있지만 실제 데이터 구조가 아니라는 것입니다. 요컨대, 모든 세그먼트가 연결되고 모든 세그먼트가 고유합니다.

답변:


4

아마도 "지역 채우기"? 여기여기를 참조 하십시오 .

편집하다

또 다른 가능성은 제한 삼각 측량 입니다. (링크는 마우스를 사용하여 그래프를 그린 다음 평면 스윕 알고리즘을 설명하여 삼각 측량하는 Java 애플릿에 대한 링크입니다.) 이러한 삼각 측량 결과는 수행 방법에 관계없이 쉽게 처리 할 수 ​​있습니다. 원하는 다각형을 만듭니다. 새로 만든 가장자리를 공유하는 모든 인접 삼각형을 병합하기 만하면됩니다.

원본 그래프 :

원본 그래프

삼각 분할 그래프 :

여기에 이미지 설명을 입력하십시오


Bill 나는 그것을 겪지 않았기 때문에 투표에 참여했습니다 ... 다양한 분야의 사람들로부터 다른 의견을 제한하고 싶지 않습니다.

래스터 채우기를 주로 다루지 만 이것이 가장 가까운 답입니다. 래스터 또는 벡터에 첨부되지 않은 한 여전히 알고리즘 이름이 없지만 "스윕"알고리즘으로 충분할 수 있지만 좌표가 X가 아닌 Y로 정렬되는 이유를 알 수 없습니다. 대부분의 언어로 구현하기 쉽습니다).

제안한 것처럼 y 또는 x를 기준으로 @Dan 정렬은 중요하지 않습니다. 또한 평면 스위프 또는 라인 스윕 알고리즘이 포함되어 있음을 알지만 불행히도 이것은 거의 모든 계산 기하학 절차를 다루는 일반적인 기술이므로 알고리즘을 구체적으로 검색하기에 적합한 용어는 아닙니다. 이 특정 문제는 폴리 라인 콤플렉스를 평면 (또는 구)에 포함시키는 것과 관련이 있기 때문에 순전히 그래프 이론 이 아닙니다. 따라서 좋은 알고리즘 포함에 대한 정보를 유지 해야합니다 . 이것이 실제로 영역 채우기 문제입니다. 마음에.
whuber

5

에서는 그래프 이론 , 호출이 연산은 연산 대향 . 주어진 그래프 의 이중 계산과 관련이 있습니다.

예를 들어 GeOxygène Java 라이브러리에서 그래프 ( CarteTopo 라고 )에는 getFaces 메소드가있어 얼굴 을 검색합니다 .

이것을 JTS 에서 폴리곤 라고합니다


좋은 링크. 그러나 모두 @Dan의 문제가 이미 해결되었다고 가정합니다. 그래프를 "평면"이라고 부를 수 있다는 것은 이미 다각형면을 식별했음을 의미합니다. 그는 (비행기에서) 임의의 호 컬렉션을 우선 정직성 대 평면 그래프로 변환하는 방법을 알고 싶어합니다. 이를 위해서는 DCEL과 같은 "토폴로지"를 표현해야합니다.
whuber

많은 whuber 감사합니다, 당신은 지식의 원천입니다! 어떻게 누군가가 그렇게 설득력이 있는지 궁금합니다.
Julien

4

RepRap 호스트 소프트웨어는 선분의 ​​목록 (알 수없는 임의의 순서로)을 다각형 목록으로 변환합니다.

특히, RepRap "end matching"알고리즘 은 많은 병리학 적 사례를 처리합니다.

아아 RepRap 소프트웨어는 구석 구석이 있다고 가정 하더라도 그것에가는 가장자리의 수 - 일반 객체의 모서리에가는 2 개 라인; 한 객체의 모퉁이가 다른 객체의 모퉁이에 닿을 때 4 줄이 합쳐집니다. 나는이 알고리즘을 보로 노이 다이어그램을 처리하도록 조정하는 것이 얼마나 어려운지 알지 못합니다. 보통 각 모서리에 3 개의 가장자리가 있습니다.


+1 재미있는 발견! 이 소프트웨어는 선을 다각형으로 연결하는 것과 관련된 많은 문제를 해결할 수있는 것처럼 보이지만 너무 많은 작업을 수행 할 수 있습니다 . 기능을 단순화하려고 시도하는 것 같습니다. 이는 바람직하지 않은 부작용 일 수 있습니다. (예를 들어, 위상 무결성을 파괴 할 수 있습니다.)
whuber

3

문제 해결을 위해 GRASS의 코드베이스를 살펴 보셨습니까? -> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html


1
감사합니다 ...하지만 난 "패키지"특정 솔루션을 찾고 있지 않다 그러나 오는 아이디어를 유지 ... GIS의 다양한 분야, 경화제 기하 구조 및 / 또는 경화제 과학을 와서 알고리즘 및 / 또는 그 이름을 기본

내 링크에서 언급 된 2 가지 프로세스의 소스 코드를 구체적으로 살펴 보는 것이 도움이 될 수 있습니다.
oeon

뭔가 빠지지 않는 한 해당 페이지에 목록이 표시되지 않으므로 코드를 보려면 소프트웨어를 설치해야 할 것 같습니다.

1
당신은 온라인 GRASS의 자원을 검색 할 수 있습니다 trac.osgeo.org/grass/browser
언더 다크를

@underdark 포인터 감사합니다. 소스 main.c에서 알 수 있는 한 v.type, 기능은 경계로 다시 레이블이 지정됩니다. 실제 처리는 발생하지 않습니다. 돌이켜 보면 이것은 그리 놀라운 일이 아닙니다. (확실하지 않은 경우) 피쳐가 완전한 2D 토폴로지 정보로 유지되는 경우, 다각형 영역을 식별하기위한 모든 계산은 피쳐 생성 또는 가져 오기 중에 자동으로 수행되어 전체에 걸쳐 유지됩니다 모든 지오 프로세싱 작업.
whuber

3

어이

나는 당신이 찾고있는 것이 특정 알고리즘이라고 생각하지 않습니다. 작업은 데이터 세트에 따라 매우 어렵거나 매우 간단 할 수 있습니다.

최소한 두 부분으로 문제를 나누어야합니다. 1) 더 많은 네트워킹 문제, 줄 문자열의 닫힌 고리를 찾는 방법입니다. 2) 닫힌 선 스트링을 다각형으로 표현

"선을 다각형으로 변환"하는 두 번째 부분은 다각형 / 선 스트링 표현보다 더 많은 형식에 의존합니다. 나는 다음을 의미합니다.

LINESTRING (1 1, 2 2)
LINESTRING (2 2, 2 1)
LINESTRING (2 1, 1 1)

:
POLYGON ((1 1,2 2,2 1,1 1))

선을 다각형으로 변환하고 있지만 당신이 말하는 것은 아닙니다. 더 어려운 부분이 처음입니다. 줄 스파게티가있는 경우 닫힌 줄 문자열로 주문하는 방법.

그 질문에 대한 대답은 많은 데이터 세트에 달려 있다고 생각합니다. 커크가 묻는 것처럼 선이 문제를 해결할 수 있는지 여부는 훨씬 큽니다. 모든 "라인 콜렉션"이 닫힌 라인 스트링의 일부라는 것을 알면 쉬워집니다. 그런 다음 줄을 잡고 다시 돌아올 때까지 길을 돌아 다니면서 위의 2 단계로 넘어갈 수 있습니다.

내 요점은 데이터 세트의 조건이 그것을 수행하는 방법에 대한 모든 규칙을 설정한다는 것입니다. 선 스트링의 스파게티에서 가능한 모든 다각형을 찾으려면 모든 교차점에 정점을 배치하고 가능한 모든 경로를 검색하는 데 관련된 많은 다른 알고리즘이 있어야한다고 가정합니다.

PostGIS에서이 함수는 ST_Polygonize 라고합니다.이 함수는 사용자가 지정한 선 스트링에서 가능한 모든 다각형을 만듭니다.

이것은 GEOS에 의해 수행되므로 GEOS 및 JTS 코드에서 알고리즘을 찾을 수 있습니다.

몇 가지 생각

/ 니클라스


1

"Forward Star"알고리즘을 검색해보십시오. 나는 그것이 일반적인 것이라고 들었지만, 내가 읽은 그것에 대한 유일한 토론은 항상 arcgis와 관련이 있습니다. 이 강의 노트 에 인용 된 참고 문헌을 참고해보십시오 .


1
이 의견은 제안 된 솔루션 중 일부를 다루더라도 여기에 의견을 제시합니다. 문제 네트워크 (또는 그래프)로 나타낼 수 없습니다 . 2 차원 표면 내 에서 선이 어떻게 연결되는지에 대한 정보가 필요합니다 . 따라서 전진 / 후진 스타 표현은 거의 쓸모가 없습니다. DCEL 또는 이와 유사한 것이 필요합니다.
whuber

@ whuber-나는 모든 "결함"이 제거되었다는 Dan의 의견이 선이 깨끗하다는 것을 암시한다고 가정했다. 따라서 그래프에서 모든주기를 찾는 그래프 순회 문제로이를 줄일 수 있어야합니다. 처음에는 Forward star가 각 노드에서 가능한 가장 오른쪽으로 회전하는 그래프를 돌아 다니는 알고리즘을 지원한다고 생각했습니다. 그러나 조금 더 보면 더 좋은 방법이있는 것으로 보입니다. stackoverflow.com/questions/261573/… 그러나 여전히 문제는 그래프로 다시 설명 될 수 있다고 가정합니다.
커크 Kuykendall

1
그래프에서 사이클을 찾는 것은 평면 그래프에서 얼굴을 찾는 것과 다릅니다. 꼭지점이 {a, b, c, d}이고 모서리가 {a, b}, {a, c}, {b, c}, {b, d}, {c, d} 인 추상 그래프를 고려하십시오. 사이클의 기초는 a-> b-> d-> c-> a 및 a-> b-> c-> a로 구성됩니다. 평면 임베딩 a-> (0,1), b-> (2,2), c-> (2,0), d-> (3,1) (모든 모서리가 선 분임)에서 사이클 A-> B-> D-> C-> A가 없는 우리는 (1,1) d 내지 이동하면되지만, 그것은 얼굴 얼굴. 이것은 왜 "면"개념이 그래프를 평면에 포함 시켜야 하는 이유와 왜 그래프의 추상 구조로부터면을 순수하게 계산할 수 없는지 보여줍니다 .
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.