어느 삼각형 점이 있는지 찾기


16

겹치지 않는 삼각형 로 구성된 2D 메쉬 와 점 집합 { p i } M i = 1N k = 1 T K로 가정 합니다. 각 점이 어느 삼각형에 있는지 결정하는 가장 좋은 방법은 무엇입니까?{Tk}k=1N{pi}i=1Mk=1NTK

예를 들어, 다음 이미지 우리가 , P (2)T (4) , P (3)T 2 I 함수 싶다 있도록 F 목록이 반환 F ( P 1 , P 2 , P 3 ) =을 [ 2 , 4 , 2 ] .p1T2p2T4p3T2ff(p1,p2,p3)=[2,4,2]

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

Matlab에는 Delaunay 메쉬에 원하는 기능을 수행 하는 함수 위치가 있지만 일반 메쉬에는 실패합니다.

나의 첫번째 (바보 같은) 생각은 모든 노드를 들면, , 모든 삼각형을 통해 루프가있는 삼각형 알아 에 그러나 이것은 매우 비효율적이다 -. 당신은 모든 지점에 대한 모든 삼각형을 반복해야 할 수도 있습니다, 그래서 O ( N M ) 작업 이 필요할 수 있습니다 .pipiO(NM)

내 다음 생각은 모든 점 에 대해 가장 가까운 이웃 검색을 통해 가장 가까운 메쉬 노드를 찾은 다음 가장 가까운 노드에 연결된 삼각형을 살펴 보는 것입니다. 이 경우, 작업은 O ( a M l o g ( N ) ) 일 것입니다. 여기서 a 는 메시의 노드에 연결된 최대 삼각형 수입니다. 이 접근법에는 해결할 수 있지만 성가신 문제가 있습니다.piO(aMlog(N))a

  • 효율적이지 않은 이웃 검색을 구현하거나 라이브러리가있는 라이브러리를 찾는 것이 중요합니다. 이는 사소한 작업이 아닙니다.
  • 각 노드에 부착 된 삼각형 목록을 저장해야합니다. 내 코드는 현재 설정되어 있지 않습니다. 지금 노드 좌표 목록과 요소 목록 만 있습니다.

모두 우아하지 않은 것처럼 보이며 더 좋은 방법이 있어야한다고 생각합니다. 이것은 많은 문제가 발생해야하므로 이론적으로 또는 사용 가능한 라이브러리 측면에서 노드가있는 삼각형을 찾는 가장 좋은 방법을 추천 할 수 있는지 궁금합니다.

감사!

답변:


16

일반적인 랜덤 에지 호핑 방법이 작동합니다. 기본적으로 메쉬의 삼각형으로 시작한 다음 대상 지점의 반대편 가장자리를 결정하십시오. 즉, 선으로 확장 될 때 삼각형의 내부에서 점을 분리하는 모서리를 결정하십시오. 두 가지 가능성이있는 경우 무작위로 하나를 선택하고 해당 공유 모서리에 인접한 삼각형을 고려한 후 반복하십시오. 무작위 화는이 방법이 들로네 삼각 분할 (Delaunay Triangulation)의 확률 1과 수렴하도록해야하며, 임의의 삼각 분할에서는 작동하지 않는 이유를 생각할 수 없습니다.

O(logN)O(MlogN)M

Edit2 : 종료가 보장되는 "보행"체계를 설명하고보다 순진한 접근 방식을 검토하는 이 PDF 를 찾았습니다 .

쿼드 트리를 사용하는 또 다른 방법은 삼각 측량 계층을 사용하는 것입니다. 올리비에 Devillers를 참조하십시오. 증분 무작위 무작위 들로네 삼각 분할 (Delaunay Triangulation) 개선. Proc. 14 번째 Annu. ACM 심 포지션. 계산. Geom., 106-115, 1998 쪽을 참조하십시오. 들로네 삼각 분할에는 가장 효과적이지만 들로네가 아닌 곳에서도 사용할 수 있습니다.

기본적으로 포인트 위치를 빠르게하기 위해 보조 데이터 구조를 구성해야합니다. 쿼드 트리 또는 기타 공간 하위 분할의 경우 하위 분할 트리를 작성해야합니다. 에지 호핑의 경우 삼각형 구조를 인접한 토폴로지 구조로 만들어야합니다. 삼각 분할 계층 구조는 또한 더 거친 삼각 분할 트리를 구축해야합니다.


빅터-에지 호핑 방식을 암시하는 오픈 소스 코드에 대해 알고 있습니까? 그것은 내 경우에 아주 좋은 해결책이 될 것 같습니다. (traingualr 메쉬 그리드에서 현재 필드에 의해 구동되는 입자 추적 모델)-감사합니다
Chris Barker

나는 이것에 대한 코드를 가지고 당신에게 그것을 보낼 수 있습니다; C / C ++에 있습니다. 아직 정리해서 Github에 게시 할 시간이 없었습니다. 나는 내 인생에서 이것을 적어도 반나절 데이터 구조로 한 번, 사변형으로 다시 작성해야했지만, 그것들을 사용할 수없고 토폴로지 구조를 직접 만들어야 할 때 쉽게 사용할 수 있습니다. 연락처 정보를 찾을 수있는 내 웹 사이트의 내 프로필 페이지를 확인하십시오. 우리는 이것을 오프라인에서 더 논의 할 수 있습니다.
Victor Liu

Hilbert 곡선 순서와 임의의 삼각형 보행을 사용하여 matlab 에서이 구현을 완료했습니다. 그것은 연구 코드입니다 : 최적화되지 않았거나 문서화되지 않았지만 여전히 매우 빠릅니다. 관심이 있다면 코드를 줄 수 있습니다.
Nick Alger

2
정보 : "" "엣지 호핑은 O (logN)" ""이어야합니다. 예를 들어, 큰 긴 삼각형 스트립의 병리학 적 경우 (삼각형 너비의 좁은 채널과 같은) 최악의 경우 한 삼각형에서 다음 삼각형으로 끝까지 홉해야합니다. 평균적으로 절반 정도입니다. 따라서 삼각형의 수를 두 배로 늘리면 O (N)가됩니다. 삼각형의 정사각형 배열 인 경우에는 O (sqrt (N))가 필요합니다. 아니면 뭔가 빠졌습니까? 크리스
크리스 바커

@Chris-scicomp에 오신 것을 환영합니다! Scicomp의 하우스 키핑의 일환으로 귀하의 답변과 다음 대화를 Victor의 답변에 대한 의견으로 이전했습니다. 귀하의 사이트 참여를 기대합니다.
Aron Ahmadia

8

귀하의 솔루션이 실제로 올바른지 확신하지 않습니다. 다음 노드가있는 상황을 고려하십시오.

  • A : (-3, 1)
  • B : (0, 2)
  • C : (3, 1)
  • D : (0, -5)

삼각형 ABC와 ACD가 있습니다. 이제 B는 원점에 가장 가까운 점이지만 원점은 B를 포함하지 않는 삼각형 ACD입니다.

O(NM)

삼각형 자체가 포함 된 쿼드 트리 를 만드는 옵션을 고려할 것 입니다. 즉, 각 노드에 저장하는 4 차 트리가 있습니다 (이는 경계 상자에 해당).

  • 박스가 분할되는 좌표, 또는 대안 적으로, 4 개의 서브 트리의 경계 박스;
  • 서브 트리에 대한 포인터;
  • 이 사각형의 경계 상자 안에 완전히 있지만 4 개의 하위 트리에는없는 삼각형 세트입니다. 다시 말해, 쿼드 트리의 두 개의 세분 선 세그먼트와 교차하는 삼각형입니다.

점 P가 주어지면 쿼드 트리의 루트에서 P를 포함하는 가장 작은 상자까지 경로의 모든 노드를 순회합니다. 해당 노드에서 발생하는 모든 삼각형을 검사해야합니다. '잘 동작하는'삼각 분할의 경우 와 같은 것만 있어야합니다.nnlognO(NM)


흠. 반면에 삼각 분할이 들로네이면 가장 가까운 이웃이 효과가 있다고 생각합니다. 내가하려는 일에 너무 제한적이지만 Delaunay의 경우 이중 Voronoi 다이어그램을 고려하십시오-Voronoi 셀은 노드에 가장 가까운 점 세트이며 들로네 삼각형의 가장자리는 모두 Voronoi의 가장자리를 충족합니다 셀은 직각으로되어 있으므로 모든 점은 가장 가까운 노드에 연결된 삼각형 안에 있어야합니다. 이것이 matlab의 pointLocation 함수가 후드에서 어떻게 작동하는지 궁금합니다 ..?
Nick Alger 2016 년

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