2011-07-29 4 views
3

vtkPoints라는 VTK 클래스와 관련된 질문이 있습니다. 클래스에는 개별 점을 삽입하는 기능이 있지만 개별 점을 제거하는 기능은 없습니다. 이는 vtkPoints :: Modified()를 호출하여 뷰를 업데이트/재 렌더링하기 위해 그래픽 파이프 라인을 다시 구동해야하는 경우에 불편합니다. vtkPoints를 다시 초기화하고, 모든 포인트를 다시 추가하고, 뷰를 업데이트/렌더링하는 명백한 경우는 너무 느리고 자원 집약적입니다.vtkPoints에서 개별 포인트를 제거하십시오.

이 문제를 해결할 수 있습니까?

감사 timecatcher

답변

0

없음 :이 플로트 [] 배열로 가변성에 동일한 제한을 갖는다. 없다 요점을 제거하는 유일한 방법은 복사하고 제외하는 것입니다. 미리 할당 된 저장소를 초과하는 경우 Insert() 작업을 수행 할 때 동일한 복사 패널티가 발생합니다.

기타 관련 데이터 구조 옵션에는 vtkCollection 및 vtkPolyData가 있습니다. 또한 PolyData 클립 필터의 소스를 살펴보면 이러한 유형의 작업이 내부적으로 구현되는 방식에 대한 아이디어를 얻을 수 있습니다. 즉, 데이터 구조의 제한 내에서 가능한 빨리 처리해야합니다. .

0

포인트를 vtkPoints에서 삭제하면 해당 포인트를 사용하는 데이터 세트가 손상 될 수 있습니다. 또한 해당 지점을 사용하는 모든 셀을 삭제하고 포인트 데이터 배열을 축소해야합니다.

vtkPoints 개체를 수정하기 위해 vtkPoints를 만드는 필터가 있고 RequestData() 메서드에서 해당 개체를 사용하는 모든 필터가있는 것이 좋습니다.

1

vtkPoint에서 개별 점을 제거 할 수있는 방법이 없습니다. 여기에 문제가 무엇인지에 따라 몇 가지 잠재적 솔루션이 있습니다 :

  1. 단일 vtkPoint 인스턴스에 모든 포인트를 저장하고, 제거하려는 포인트를 덮어 쓰기 위해 대체 할 값으로 덮어 씁니다. 이것은 포인트 클라우드가 사용할 수있는 최대 메모리 용량을 제한하는 데 유용합니다.
  2. 하나의 vtkPoint 인스턴스에 모든 포인트를 저장하고 제거하려는 포인트를 씬에서 멀리 떨어진 값으로 덮어 씁니다.
  3. 각 포인트에 대해 vtkPoint, vtkCellArray 및 vtkPolyData를 만들고 vtkAppendPolyData를 사용하여 함께 연결하십시오. RemoveInput (vtkPolyData *)을 사용하면 개별 점을 제거 할 수 있습니다.
0

예제 http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/DeletePoint은 다소 간단한 해결책이 있습니다. 삭제할 ID를 필터링하여 다른 임시 vtkPoints로 복사하고 원본으로 복사합니다 (

void ReallyDeletePoint(vtkSmartPointer<vtkPoints> points, vtkIdType id) 
{ 
    vtkSmartPointer<vtkPoints> newPoints = 
    vtkSmartPointer<vtkPoints>::New(); 

    for(vtkIdType i = 0; i < points->GetNumberOfPoints(); i++) 
    { 
    if(i != id) 
     { 
     double p[3]; 
     points->GetPoint(i,p); 
     newPoints->InsertNextPoint(p); 
     } 
    } 

    points->ShallowCopy(newPoints); 
} 
)
관련 문제