Ошибка сегментации при использовании vtkPolyLine в пользовательском фильтре Paraview

Я хочу отображать несколько наборов 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);

Выходные данные ofcriticalLines[i][j].PrintSelf(); показывают ожидаемые значения.

При использовании vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New(); вместо vtkPolyLine все работает нормально.

Решение этого создание нескольких полилиний с заданным набором точек использование vtk как-то связано с проблемой, похоже, не то, что я искал.

Я не уверен, что отсутствует/неправильно в моем коде. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Любая помощь очень ценится!


person Philipp Jung    schedule 20.11.2016    source источник


Ответы (1)


Ваш vtkPolyLine должен выделить место для идентификаторов точек, например

polyLine->GetPointIds()->SetNumberOfIds(5);

в примере, на который вы ссылаетесь. В вашем случае вам нужно позвонить

polyLine->GetPointIds()->SetNumberOfIds(criticalLines[i].size());

сразу после создания polyLine.

person Cory Quammen    schedule 21.11.2016
comment
Спасибо! Я полностью пропустил это. - person Philipp Jung; 29.11.2016