vtk学习笔记六

这篇博客详细介绍了使用VTK进行特定绘图的方法,包括颜色图例、平面图表、散点图和物体边界显示。同时,还讨论了如何使用vtkScalarBar和vtkXYPlotActor来创建颜色图例和X-Y平面图表。此外,还提到了数据转换过程,如使用vtkTransformFilter和vtkTransformPolyDataFilter对数据进行变换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特定绘图

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值