나는 평면 배열을 감지하고 싶습니다 (> 100000 포인트) 매우 큰 포인트 클라우드가 있습니다. 나는 팔레트를 사용하여 포인트를 아주 작은 평면 클러스터로 나누고 이웃을 병합하기로 결정했습니다 동일 평면 인 클러스터. 포함하는 배열 OctreeNode* children[8]
와 OctreeNode
의가있다 : 나는옥트리에 잎을 합치는 것
내 Octree
구현은 포인터 구조를 사용 ... 빨리 작은 평면 클러스터로 포인트 클라우드를 분할,하지만 어떻게 효과적으로 나를 벗어난입니다 병합 C++ 코드를 작성했습니다 자식 노드에 대한 포인터이거나 리프 노드 인 경우 모두 NULL
포인터입니다.
내 첫 번째 생각은 각 OctreeNode
개체에서 Plane
개체에 대한 포인터를 유지하는 것이 었습니다. 포인트를 처음으로 분할 한 후, 팔레트의 각 리프는 리프에 포함 된 모든 포인트에 맞는 최소 제곱을 나타내는 Plane
이됩니다. 그런 다음 트리의 모든 리프 노드를 반복합니다. 각 리프 노드에 대해 이웃 노드의 각 노드를 확인합니다. 인접한 노드의 평면을 현재 리프의 평면과 병합해야한다면 Plane* newPlane = Plane::mergePlanes(this->plane, neighbor->plane);
을 호출하여 두 노드의 점을 나타내는 새 평면을 만듭니다.
문제가 생겨서 처음 두 비행기를 모두 새 비행기 (예 : plane = newPlane; neighbor->plane = newPlane;
)로 대체하고 완료해야한다고 생각했습니다. (메모리 누수는 제쳐두고 실제 코드로 처리했습니다.) 불행하게도 이것은 실제로 작동하지 않습니다. 여러 비행기를 병합 한 후에는 이 하나만 Plane
을 가리킬 수 있으며 단순히 포인터를 this->plane
및 neighbor->plane
으로 바꾸어도 이전 비행기를 가리키는 모든 포인터가 대체되지는 않습니다.
솔루션은 처음 출시되었을 때도 hackish처럼 보였으 나 이제는 그 결함이 더욱 분명 해졌습니다. 누구든지 내가 생각해 낸 합병 방법을 고치는 방법을 생각하거나 더 나은 것을 생각할 수 있습니까?
는