알고리즘에 대한 독특한 가장자리에서 다각형 메시
-
03-07-2019 - |
문제
내가 찾는 것은 좋은 알고리즘을 줄 수 있는 나에게 독특한 가장자리에서의 다각형 데이터입니다.이 경우에,이 다각형은 정의 두 배열입니다.하나의 배열은 수의 포인트별 다각형,그리고 다른 배열은 목록의 정점을 지수입니다.
나는 버전이 있는 그지만,성능이 느리에 도달 할 때 500,000 길 수 없습니다.내 버전 산책을 통해 각각의 얼굴과 추가 각자의 정점을 stl::설정합니다.나의 데이터 설정은 주로 삼각형 쿼드 폴리,그리고 대부분의 가장자리에 공유될 것입니다.
이 있는 똑똑한 알고리즘에 대한 이?
해결책
네
사용 두 번 해시 지도입니다.
각 가장자리에는 두 개의 인덱스,B.말할 수는 A>B
첫째,최고 수준의 해쉬도 지도를 다시 지도는 차례로 maps B 어떤 값을 나타내는 당신이 원하는 정보에 대한 모든 가장자리입니다.(또는 bool 지 않는 경우에 필요한 정보를 유지하는 것이 가장자리).
기본적으로 이 두 가지 수준의 트리 구성하는 해시의지도입니다.
보 edge 이 구조에서 당신은 큰 인덱스,그것을 보면서 최고 수준과 끝까지 함께 해시 지도입니다.다음은 작은 지수와 모양에 그것을 이 해시 지도입니다.
다른 팁
명확히하기 위해, 당신은 다음과 같은 다각형 목록을 원합니다.
A +-----+ B
\ |\
\ 1 | \
\ | \
\ | 2 \
\| \
C +-----+ D
그런 다음 다음과 같은 가장자리 대신 :
A - B -+
B - C +- first polygon
C - A -+
B - D -+
D - C +- second polygon
C - B -+
그런 다음 중복 B -C 대 C -B 가장자리를 제거하고 공유하고 싶습니까?
알고리즘으로 어떤 종류의 성능 문제를보고 있습니까? 합리적인 해시 구현이있는 세트는 꽤 괜찮을 것입니다. 반면에 해시가 데이터에 최적이 아닌 경우 성능에 크게 영향을 줄 수있는 많은 충돌이 발생합니다.
둘 다 맞습니다. 좋은 해시 세트를 사용하면 필요한 수준을 넘어 성능을 얻었습니다. 나는 내 자신의 작은 해시 세트를 굴 렸습니다.
총 가장자리 수는 N/2와 N. N 사이에 있습니다. 모든 공유 가장자리는 N/2가 될 것이며 모든 고유 한 가장자리는 N이 될 것입니다. 여기에서 UINT64의 버퍼를 할당하고 내 지수를 이러한 값에 포장합니다. 작은 독특한 테이블 세트를 사용하여 고유 한 가장자리를 빠르게 찾을 수 있습니다!
그녀는 얼굴에서 가장자리를 빠르게 만들기 위해 정확하게 블렌더에 사용 된 Edge Hashing의 C 구현으로, 다른 사람들이 자신의 힌트를 만들 수 있습니다.
이것은 bli_mempool을 사용합니다.https://gitorious.org/blenderprojects/blender/blobs/master/blender/source/blender/blenlib/intern/bli_mempool.c
먼저 정점이 고유한지 확인해야합니다. 그것은 당신이 특정 위치에서 하나의 가장자리만을 원한다면입니다. 그런 다음이 데이터 구조를 사용합니다
typedef std::pair<int, int> Edge;
Edge sampleEdge;
std::map<Edge, bool> uniqueEdges;
Edge에는 정렬 된 순서로 Edge를 구성하는 정점 지수가 포함되어 있습니다. 따라서 SampleDge가 인덱스 번호 12 및 5가있는 정점으로 구성된 가장자리 인 경우, sample 에디드 .first = 5 및 sampledge.12
그럼 당신은 그냥 할 수 있습니다
uniqueEdges[sampleEdge] = true;
모든 가장자리에 대해. 독창적 인 모서리는 모든 고유 한 가장자리를 담을 것입니다.