特定绘图
VTK提供了一些特定的绘图类,用于绘制颜色图例,X-Y平面图表以及三维空间中的坐标轴
颜色图例
- vtkScalarBar用于绘制分级的颜色图例
- 不同的颜色对应不同的标量值
- 颜色图例由矩形框、注记、标题三部分组成
- vtkScalarBar一般与vtkLookupTable配套使用
#include <vtkActor.h>
#include <vtkFloatArray.h>
#include <vtkLookupTable.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkScalarBarActor.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include "vtkAutoInit.h"
int main (int, char *[])
{
//注意:这句话必须要加,否则会报错
VTK_MODULE_INIT(vtkRenderingFreeType)
// 创建一个几何球体
vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();
sphere->SetCenter(0,0,0);
sphere->SetRadius(1);
sphere->Update();
// 创建一个标量数据集来关联几何球体的顶点
int numPts = sphere->GetOutput()->GetPoints()->GetNumberOfPoints();
vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();
scalars->SetNumberOfValues( numPts );
for( int i = 0; i < numPts; ++i )
{
scalars->SetValue(i,static_cast<float>(i)/numPts);
}
vtkSmartPointer<vtkPolyData> poly = vtkSmartPointer<vtkPolyData>::New();
poly->DeepCopy(sphere->GetOutput());
//将标量数据集关联到球体数据的顶点
poly->GetPointData()->SetScalars(scalars);
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(poly);
mapper->ScalarVisibilityOn();
mapper->SetScalarModeToUsePointData();
mapper->SetColorModeToMapScalars();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkScalarBarActor> scalarBar = vtkSmartPointer<vtkScalarBarActor>::New();
scalarBar->SetLookupTable(mapper->GetLookupTable());
scalarBar->SetTitle("Title");
scalarBar->SetNumberOfLabels(4);
// Create a lookup table to share between the mapper and the scalarbar
vtkSmartPointer<vtkLookupTable> hueLut = vtkSmartPointer<vtkLookupTable>::New();
hueLut->SetTableRange (0, 1);
hueLut->SetHueRange (0, 1);
hueLut->SetSaturationRange (1, 1);
hueLut->SetValueRange (1, 1);
hueLut->Build();
mapper->SetLookupTable( hueLut );
scalarBar->SetLookupTable( hueLut );
// Create a renderer and render window
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->GradientBackgroundOn();
renderer->SetBackground(1,1,1);
renderer->SetBackground2(0,0,0);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
// Create an interactor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actors to the scene
renderer->AddActor(actor);
renderer->AddActor2D(scalarBar);
// Render the scene (lights and cameras are created automatically)
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
绘制平面图表
- vtkXYPlotActor类负责在X-Y平面绘制图表
- 图表类型包括折线图、曲线图
- 绘制时需要输入绘制数据,并建立坐标轴
//不知道为啥一下程序会crash,可能与绘制的数据相关
#include "vtkAutoInit.h"
//注意:这句话必须要加,否则会报错
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSphereSource.h>
#include <vtkMath.h>
#include <vtkDoubleArray.h>
#include <vtkFieldData.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkXYPlotActor.h>
#include "vtkDataSet.h"
#include "vtkFloatArray.h"
int main(int, char *[])
{
vtkSmartPointer<vtkXYPlotActor> plot = vtkSmartPointer<vtkXYPlotActor>::New();
plot->ExchangeAxesOff();
plot->SetLabelFormat( "%g" );
plot->SetXTitle( "Level" );
plot->SetYTitle( "Frequency" );
plot->SetXValuesToIndex();
for (unsigned int i = 0 ; i < 2 ; i++)
{
vtkSmartPointer<vtkDoubleArray> array_s = vtkSmartPointer<vtkDoubleArray>::New();
vtkSmartPointer<vtkFieldData> field = vtkSmartPointer<vtkFieldData>::New();
vtkSmartPointer<vtkDataObject> data = vtkSmartPointer<vtkDataObject>::New();
for (int b = 0; b < 30; b++) /// Assuming an array of 30 elements
{
double val = vtkMath::Random(0.0,2.0);
array_s->InsertValue(b,val);
}
field->AddArray(array_s);
data->SetFieldData(field);
plot->AddDataObjectInput(data);
}
plot->SetPlotColor(0,1,0,0);
plot->SetPlotColor(1,0,1,0);
// Create a renderer and render window
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(plot);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
// Create an interactor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
//renderWindow->Render();
renderWindowInteractor->Initialize();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
平面图表属性设置
vtkXYPlotActor *xyplot = vtkXYPlotActor::New();
xyplot->AddInput(probe->GetOutput());
xyplot->AddInput(probe2->GetOutput());
xyplot->AddInput(probe3->GetOutput());
xyplot->GetAxisLabelTextProperty()->SetColor(0 , 0 , 0);
xyplot->GetAxisLabelTextProperty()->SetFontSize(12);
//设置标题文字颜色
xyplot->GetAxisTitleTextProperty()->SetColor(0 , 0 , 0);
//设置线的颜色
xyplot->GetProperty()->SetColor(0 , 0 , 0);
xyplot->GetProperty()->SetLineWidth(2);
xyplot->SetTitle("Pressure vs. Arc Length (Zoomed View)");
xyplot->SetXTitle("");
xyplot->SetYTitle("p");
xyplot->SetXRange(0.1,0.35);
xyplot->SetYRange(0.2,0.4);
xyplot->GetPositionCoordinate()->SetValue(0.0,0.67,0.0);
xyplot->GetPosition2Coordinate()->SetValue(1.0,0.33,0.0);
xyplot->SetNumberOfXLabels(6);
xyplot->SetXValuesToArcLength();
绘制散点图
#include "vtkAutoInit.h"
//注意:这句话必须要加,否则会报错
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle