vtk 6.x,Qt:3D(线、面、散点图)绘图

Posted

技术标签:

【中文标题】vtk 6.x,Qt:3D(线、面、散点图)绘图【英文标题】:vtk 6.x, Qt: 3D (line, surface, scatter) plotting 【发布时间】:2014-01-27 16:34:02 【问题描述】:

我正在从事 Qt (4.7.4) 项目,需要在 2D 和 3D 坐标系中绘制数据。我一直在研究 vtk 6.1,因为它总体上看起来非常强大,而且我还需要在以后可视化图像数据。我基本上得到了 2D 绘图,但在 3D 中绘制数据时卡住了。

这是我尝试过的:我正在使用从 vtk 的一项测试( Charts / Core / Testing / Cxx / TestSurfacePlot.cxx )中获取的以下代码。我唯一添加的是我在 GUI 及其交互器中使用的 QVTKWidget:

QVTKWidget vtkWidget;
vtkNew<vtkChartXYZ> chart;
vtkNew<vtkPlotSurface> plot;
vtkNew<vtkContextView> view;
view->GetRenderWindow()->SetSize(400, 300);
vtkWidget.SetRenderWindow(view->GetRenderWindow());

view->GetScene()->AddItem(chart.GetPointer());

chart->SetGeometry(vtkRectf(75.0, 20.0, 250, 260));

// Create a surface
vtkNew<vtkTable> table;
float numPoints = 70;
float inc = 9.424778 / (numPoints - 1);
for (float i = 0; i < numPoints; ++i)

    vtkNew<vtkFloatArray> arr;
    table->AddColumn(arr.GetPointer());

table->SetNumberOfRows(numPoints);
for (float i = 0; i < numPoints; ++i)

    float x = i * inc;
    for (float j = 0; j < numPoints; ++j)
    
        float y  = j * inc;
        table->SetValue(i, j, sin(sqrt(x*x + y*y)));
    


// Set up the surface plot we wish to visualize and add it to the chart.
plot->SetXRange(0, 9.424778);
plot->SetYRange(0, 9.424778);
plot->SetInputData(table.GetPointer());
chart->AddPlot(plot.GetPointer());

view->GetRenderWindow()->SetMultiSamples(0);
view->SetInteractor(vtkWidget.GetInteractor());
view->GetInteractor()->Initialize();
view->GetRenderWindow()->Render();

现在,这产生了一个情节,但我既不能与之互动,它看起来也不是 3D 的。我想做一些基本的事情,比如缩放、平移或绕轴旋转。我想到的几个问题是:

将QVTKWidget交互器分配给倒数第三行的视图是否正确? 在测试中,vtkChartXYZ 被添加到 vtkContextView 中。根据文档,vtkContextView 用于显示 2D 场景,但此处与 3D 图表 (XYZ) 一起使用。这如何结合在一起?

【问题讨论】:

查看 VTK 示例,例如vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/Cube 了解vtkRenderWindowInteractor 【参考方案1】:

以下代码对我有用。无需显式分配交互器,因为 QVTKWidget 已经处理好了。

QVTKWidget vtkWidget;
vtkSmartPointer<vtkContextView> view  = vtkSmartPointer<vtkContextView>::New();
vtkSmartPointer<vtkChartXYZ>    chart = vtkSmartPointer<vtkChartXYZ>::New();

// Create a surface
vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
float numPoints = 70;
float inc = 9.424778 / (numPoints - 1);
for (float i = 0; i < numPoints; ++i)

   vtkSmartPointer<vtkFloatArray> arr = vtkSmartPointer<vtkFloatArray>::New();
   table->AddColumn(arr.GetPointer());

table->SetNumberOfRows(numPoints);
for (float i = 0; i < numPoints; ++i)

    float x = i * inc;
    for (float j = 0; j < numPoints; ++j)
    
        float y  = j * inc;
        table->SetValue(i, j, sin(sqrt(x*x + y*y)));
    


view->SetRenderWindow(vtkWidget.GetRenderWindow());
chart->SetGeometry(vtkRectf(200.0, 200.0, 300, 300));
view->GetScene()->AddItem(chart.GetPointer());

vtkSmartPointer<vtkPlotSurface> plot = vtkSmartPointer<vtkPlotSurface>::New();

// Set up the surface plot we wish to visualize and add it to the chart.
plot->SetXRange(0, 10.0);
plot->SetYRange(0, 10.0);
plot->SetInputData(table.GetPointer());
chart->AddPlot(plot.GetPointer());

view->GetRenderWindow()->SetMultiSamples(0);
view->GetRenderWindow()->Render();

【讨论】:

【参考方案2】:

您可能需要阅读vtkRenderViewBase中的详细说明

QVTKWidget *widget = new QVTKWidget;
vtkContextView *view = vtkContextView::New();
view->SetInteractor(widget->GetInteractor());
widget->SetRenderWindow(view->GetRenderWindow());

【讨论】:

以上是关于vtk 6.x,Qt:3D(线、面、散点图)绘图的主要内容,如果未能解决你的问题,请参考以下文章

R绘图基础指南 3. 散点图(合集)

R语言绘图:复杂散点图绘制

还在用Excel画散点图?不试试极坐标散点图?

python 绘制三维图形、三维数据散点图

Qt开发技术:Q3D图表开发笔记:Q3DScatter三维散点图介绍Demo以及代码详解

excel绘制散点图时,如何进行分组绘图?