2011-07-29 42 views
3

我有一個關於VTK類的問題,名爲vtkPoints。該類具有插入單個點的功能,但不具有刪除單個點的功能。這對於需要通過調用vtkPoints :: Modified()來更新視圖來再次驅動圖形管道以更新/重新呈現視圖來說很不方便。重新初始化vtkPoints,再次添加所有點以及更新/重新渲染視圖的明顯情況是太慢和資源密集型的。從vtkPoints刪除單個點

有沒有解決這個問題的方法?

謝謝, timecatcher

回答

0

號:其對可變性相同的限制爲一個float []數組。刪除點的唯一方法是複製和排除。請注意,如果超出預先分配的存儲空間,則在執行Insert()操作時會產生相同的副本損失。

其他相關的數據結構選項包括vtkCollection和vtkPolyData。此外,查看某些PolyData剪輯篩選器的源代碼可能會提供信息,以瞭解這些類型的操作在內部實現的方式 - 這些操作應該儘可能快地處於數據結構的限制範圍內。

0

允許從vtkPoints中刪除點可能會導致使用該點的數據集損壞。您還必須刪除使用該點的所有單元格以及縮小點數據數組。

我會建議如果你有一個過濾器創建vtkPoints來修改vtkPoints對象和任何依賴於RequestData()方法的對象。

1

無法從vtkPoints刪除單個點。取決於你的問題在這裏有一些潛在的解決方案:

  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); 
}