gpt4 book ai didi

c++ - vtk 6.x,Qt : 3D (line, 表面,散点图)绘图

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:08 24 4
gpt4 key购买 nike

我正在开发一个 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 交互器分配给倒数第三行的 View 是否正确?
  • 在测试中,将 vtkChartXYZ 添加到 vtkContextView。根据文档,vtkContextView 用于显示 2D 场景,但此处与 3D 图表 (XYZ) 一起使用。这如何组合在一起?

最佳答案

以下代码对我有用。无需显式分配交互器,因为 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();

关于c++ - vtk 6.x,Qt : 3D (line, 表面,散点图)绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com