Я хочу отобразить несколько наборов 3D-точек, используя vtkPolyLine.
Точки хранятся в виде узлов (пользовательский класс) в многомерном векторе:
vector<vector <Node> > criticalLines;
где узел имеет: double posX; double posY; double posZ;
сохранить свою позицию.
В следующем разделе я попытался использовать vtkPolyLine, похожий на этот пример:
http://www.paraview.org/Wiki/VTK/Examples/Cxx/GeometricObjects/PolyLine
Эта функция вызывается после заполнения вектора узлами:
void Algorithm::displayLines(vtkSmartPointer<vtkPoints> points,vtkSmartPointer<vtkCellArray> lines)
{
for(int i = 0; i<criticalLines.size(); i++)
{
if(criticalLines[i].empty())
{
continue;
}
vtkSmartPointer<vtkPolyLine> polyLine =
vtkSmartPointer<vtkPolyLine>::New()
for(int j =0; j< criticalLines[i].size(); ++j)
{
vtkIdType idx=points->InsertNextPoint(criticalLines[i][j].posX,
criticalLines[i][j].posY,
criticalLines[i][j].posZ);
//print posX,posY,posZ of current Node
criticalLines[i][j].PrintSelf();//Seg. Fault occurs here
polyLine->GetPointIds()->SetId(j,idx);}
lines->InsertNextCell(polyLine);
}
}
И то и другое points
а также lines
определяются в файле Algorithm.h и инициализируются в конструкторе следующим образом:
points = vtkSmartPointer<vtkPoints>::New();
lines = vtkSmartPointer<vtkCellArray>::New();
И добавил к vtkPolyData
позже:
vtkSmartPointer<vtkPolyData> opd=vtkSmartPointer<vtkPolyData>::New() ;
opd->SetPoints(algorithm.points);
opd->SetLines(algorithm.lines);
Выход изcriticalLines[i][j].PrintSelf();
показывает значения, как ожидалось.
Когда используешь vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
вместо vtkPolyLine
все отлично работает
Решение этой проблемы создать несколько полилиний с заданным набором точек, используя vtk каким-то образом связанная проблема, казалось, не была тем, что я искал.
Я не уверен, что отсутствует / неправильно в моем кодексе.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Любая помощь очень ценится!
Ваш vtkPolyLine
необходимо выделить место для идентификаторов точек, например
polyLine->GetPointIds()->SetNumberOfIds(5);
в примере, на который вы ссылались. В вашем случае вам нужно позвонить
polyLine->GetPointIds()->SetNumberOfIds(criticalLines[i].size());
сразу после создания polyLine
,
Других решений пока нет …