Как нарисовать примитивы (точки, линии и т. Д.) В vtk? - PullRequest
0 голосов
/ 10 июня 2011

Мне нужно рисовать примитивы на vtkActor, но я не знаю как. Может быть, я могу использовать функции OpenGL для этого? В этом примере http://www.vtk.org/Wiki/VTK/Examples/Cxx/Plotting/Diagram работает, но мне нужно нарисовать его в интерактивном режиме. Спасибо за ответы.

Ответы [ 3 ]

0 голосов
/ 14 июня 2011

Отказ от ответственности: непроверенный код! Я пишу это по памяти. Поэтому протестируйте и прочитайте руководство по мере необходимости. Обратите внимание, что следующий код рисует одну линию. По соображениям производительности я предлагаю вместо создания актера в каждой строке. Создайте несколько строк (если не все ваши строки) в одном актере. Просто добавьте очки и установите правильные индексы ...

vtkPoints* points = vtkPoints::New();
vtkCellArray* lineIndices = vtkCellArray::New();

points->InsertNextPoint( 0, 0, 0);
points->InsertNextPoint(10, 0, 0);

lineIndices->InsertNextCell(2);
lineIndices->InsertNextCellPoint(0); // indices to points array.
lineIndices->InsertNextCellPoint(1);

vtkPolyData* polyData = vtkPolyData::New();
polyData->SetPoints(points);
polyData->SetLines(lines);

// continue with standard mapper, actor setup...
0 голосов
/ 13 января 2016

Я искал способ нарисовать сетку на экране с помощью VTK, и я придумал этот фрагмент кода:

vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> lineIndices = vtkSmartPointer<vtkCellArray>::New();

for(int iIndex = 0, connectivityIndex = 0; iIndex <= m_resolution; ++iIndex, connectivityIndex += 4)
{
    double pointCoordinate = m_range[0] + (m_range[1] - m_range[0]) * (iIndex / static_cast<double>(m_resolution));
    points->InsertNextPoint(pointCoordinate, -m_range[1], 0.0);
    points->InsertNextPoint(pointCoordinate,  m_range[1], 0.0);

    points->InsertNextPoint(-m_range[1], pointCoordinate, 0.0);
    points->InsertNextPoint( m_range[1], pointCoordinate, 0.0);

    lineIndices->InsertNextCell(2);
    lineIndices->InsertCellPoint(connectivityIndex + 0);
    lineIndices->InsertCellPoint(connectivityIndex + 1);

    lineIndices->InsertNextCell(2);
    lineIndices->InsertCellPoint(connectivityIndex + 2);
    lineIndices->InsertCellPoint(connectivityIndex + 3);
}

vtkSmartPointer<vtkPolyData> data = vtkSmartPointer<vtkPolyData>::New();
data->SetPoints(points);
data->SetLines(lineIndices);

vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(data);

vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);

vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);

Он был основан на @shash-коде и работает.

0 голосов
/ 14 июня 2011

Что вы подразумеваете под рисованием примитивов?

Видите ли, VTK больше настроен на рендеринг (в отличие от рисования) наборов данных различных типов. Например, трехмерные сетки можно рисовать с использованием vtkPolyDataMapper и vtkActor, а изображения - с помощью vtkImageActor и аналогичных классов.

Как правило, у вас есть один или несколько наборов данных, для которых вы создаете актеров и отображаете их на экране.

На самом деле вы не рисуете примитивы на экране, как, скажем, с помощью GDI или холста HTML5. В зависимости от того, что вы хотите, вы можете добавить другого актера с соответствующим набором данных, виджет (который является своего рода актером с интерактивностью) или двухмерного актера, который рисуется как наложение поверх всей сцены, и описывается в экранных координатах.

Если бы вы могли описать, чего вы пытаетесь достичь, я могу указать вам на некоторые более конкретные вещи.

...