vtk提供了vtkChart模块,可以显示二维散点图和曲线图等。实际开发中,向vtkChart添加vtkPlot类及其子类对象时,程序运行会奔溃,如下代码向vtkChart添加vtkPlotLine类对象,则崩溃:
#include<vtkTable.h>
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkPlotLine.h>
#include<vtkFloatArray.h>
#include<vtkChartXY.h>
#include<vtkContextActor.h>
#include<vtkActor.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
int main()
{
// 新建一个表格
vtkNew<vtkTable> dataTable;
// 添加两个列(变量)
vtkNew <vtkFloatArray> x;
x->SetName("X");
dataTable->AddColumn(x);
vtkNew <vtkFloatArray> y;
y->SetName("Y");
dataTable->AddColumn(y);
// 添加十个行
for (int i = 0; i < 10; i++)
{
// 在表格中插入新行
dataTable->InsertRow(i);
// 向每行中添加数据
double rowData[] = { std::cos(i), std::sin(i)};
dataTable->SetValue(i, 0, rowData[0]);
dataTable->SetValue(i, 1, rowData[1]);
}
// 可视化表格数据
vtkNew<vtkPlotLine>line;
line->SetInputData(dataTable, "X", "Y");
vtkNew<vtkChartXY> chart;
chart->AddPlot(line);
chart->SetAutoSize(false);
chart->SetSize(vtkRectf(0.0, 0.0, 320, 220));
vtkNew<vtkContextScene> chartScene;
vtkNew<vtkContextActor> chartActor;
vtkNew<vtkRenderWindow> renderWindow;
vtkNew<vtkRenderWindowInteractor> interactor;
vtkNew<vtkRenderer>renderer;
renderWindow->AddRenderer(renderer);
interactor->SetRenderWindow(renderWindow);
renderer->AddActor(chartActor);
chartScene->SetRenderer(renderer);
chartScene->AddItem(chart);
chartActor->SetScene(chartScene);
renderWindow->Render();
interactor->Initialize();
interactor->Start();
return EXIT_SUCCESS;
}
运行奔溃如下:

解决该问题的方法如下:
在代码顶部加入如下一句代码:
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
如果上面还不能解决问题,则打开CMake (cmake-gui),找到 VTK_MODULE_ENABLE_VTK_RenderingContextOpenGL2 选项,将默认的default改为YES,如下:

重新 Configure、Generate,编译后,库中就会有 vtkRenderingContextOpenGL2 文件,运行 VTK_MODULE_INIT(vtkRenderingContextOpenGL2) 之后,可以正常跑 Plotting 的例子。
95

被折叠的 条评论
为什么被折叠?



