⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtkdem.cpp

📁 VTK入门样例(种类齐全)
💻 CPP
字号:
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkLookupTable.h"
#include "vtkDEMReader.h"
#include "vtkImageShrink3D.h"
#include "vtkLODActor.h"
#include "vtkImageDataGeometryFilter.h"
#include "vtkWarpScalar.h"
#include "vtkElevationFilter.h"
#include "vtkCastToConcrete.h"
#include "vtkPolyDataNormals.h"
#include "vtkPolyDataMapper.h"
#include "vtkGreedyTerrainDecimation.h"
#include "vtkCamera.h"
#include "vtkVolume16Reader.h"
#include "vtkContourFilter.h"
#include "vtkMaskPoints.h"
#include "vtkSelectVisiblePoints.h"
#include "vtkLabeledDataMapper.h"
#include "vtkTextProperty.h"
#include "vtkActor2D.h"
#include "vtkBandedPolyDataContourFilter.h"
#include "vtkImageData.h"
#include "vtkActor2D.h"

void main()
{

	vtkRenderer *ren1=vtkRenderer::New();
	vtkRenderWindow *renWin=vtkRenderWindow::New();
		renWin->AddRenderer(ren1);
	vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();
		iren->SetRenderWindow(renWin);

	int Scale=3;
	vtkLookupTable *lut=vtkLookupTable::New();
	  lut->SetHueRange(0.6,0);
	  lut->SetSaturationRange(1.0,0);
	  lut->SetValueRange(0.5,1.0);

	vtkDEMReader *demModel=vtkDEMReader::New();
		demModel->SetFileName("SainteHelens.dem"); //"$VTK_DATA_ROOT/Data/SainteHelens.dem"
		demModel->Update();
		float data[2];
		demModel->GetElevationBounds(data);
	
	int shrinkFactor=4;
	vtkImageShrink3D *shrink=vtkImageShrink3D::New();
	  shrink-> SetShrinkFactors (shrinkFactor,shrinkFactor, 1);
	  shrink-> SetInputConnection (demModel->GetOutputPort());
	  shrink-> AveragingOn();

	vtkImageDataGeometryFilter *geom=vtkImageDataGeometryFilter::New();
	  geom-> SetInputConnection (shrink-> GetOutputPort());

	vtkWarpScalar *warp=vtkWarpScalar::New();
	  warp-> SetInputConnection (geom-> GetOutputPort());
	  warp-> SetNormal (0, 0, 1);
	  warp-> UseNormalOn();
	  warp-> SetScaleFactor (Scale);

	vtkBandedPolyDataContourFilter *bcf=vtkBandedPolyDataContourFilter::New();
	  bcf-> SetInput (warp-> GetPolyDataOutput());
	  bcf-> GenerateValues(15 ,demModel->GetOutput()-> GetScalarRange());
	  bcf-> SetScalarModeToIndex();
	  bcf-> GenerateContourEdgesOn();

	vtkPolyDataNormals *normals=vtkPolyDataNormals::New();
	  normals-> SetInputConnection (bcf-> GetOutputPort());
	  normals-> SetFeatureAngle (60);
	  normals-> ConsistencyOff();
	  normals-> SplittingOff();

	vtkPolyDataMapper *demMapper=vtkPolyDataMapper::New();
	  demMapper-> SetInputConnection (normals-> GetOutputPort());
	  demMapper-> SetScalarRange(0, 10);
	  demMapper ->SetLookupTable (lut);
	  demMapper-> SetScalarModeToUseCellData();

	vtkLODActor *demActor=vtkLODActor::New();
	  demActor-> SetMapper (demMapper);


	vtkVolume16Reader *reader=vtkVolume16Reader::New();
		reader->SetDataDimensions(460,460);
		reader->SetDataByteOrderToLittleEndian();
		reader->SetFilePrefix ("E://headsq/refarray");
		reader->SetImageRange(1, 41);
		reader->SetDataSpacing (22, 22, 14*3);
//		reader->SetDataOrigin(-230,-230,-160);

	vtkImageShrink3D *Shrink=vtkImageShrink3D::New();
		Shrink->SetInputConnection(reader->GetOutputPort());
		Shrink->SetShrinkFactors(4,4,1);
	
	vtkContourFilter *iso=vtkContourFilter::New();
		iso->SetInputConnection(Shrink->GetOutputPort());
		iso->GenerateValues( 6,1 ,255);
		iso->Update();
	int numPts= iso->GetOutput()->GetNumberOfPoints();

	vtkPolyDataMapper *isoMapper=vtkPolyDataMapper::New();
		isoMapper->SetInputConnection(iso->GetOutputPort());
		isoMapper->ScalarVisibilityOn();
		isoMapper->SetScalarRange(iso->GetOutput()->GetScalarRange());
	vtkActor *isoActor=vtkActor::New();
	   isoActor->SetMapper(isoMapper);

// Subsample the points and label them
	vtkMaskPoints *mask=vtkMaskPoints::New();
		mask->SetInputConnection(iso->GetOutputPort());
		mask->SetOnRatio(numPts/50);
		mask->SetMaximumNumberOfPoints(50);
		mask->RandomModeOn();

// Create labels for points - only show visible points

	vtkSelectVisiblePoints *visPts=vtkSelectVisiblePoints::New();
		visPts->SetInputConnection(mask->GetOutputPort());
		visPts->SetRenderer(ren1);

	vtkLabeledDataMapper *ldm=vtkLabeledDataMapper::New();
		ldm->SetInputConnection(mask->GetOutputPort());
		ldm->SetLabelFormat("%g"); 
		ldm->SetLabelModeToLabelScalars();
		ldm->GetLabelTextProperty()->SetFontFamilyToArial();
		ldm->GetLabelTextProperty()->SetFontSize(10);
		ldm->GetLabelTextProperty()->SetColor(1,0,0);
   
	vtkActor2D *contourLabels=vtkActor2D::New();
		contourLabels->SetMapper(ldm);

//	demActor->SetPosition(isoActor->GetPosition());

double location1[3];
	demActor->GetPosition(location1);
double location2[3];
	isoActor->GetPosition(location2);
	printf("demActor position:%f, %f ,%f \n",location1[0],location1[1],location1[2]);
	printf("isoActor position:%f, %f ,%f \n",location2[0],location2[1],location2[2]);


double *center1;
	center1=demActor->GetCenter();
double *center2;
	center2=isoActor->GetCenter();

	printf("demActor center:%f, %f ,%f \n",center1[0],center1[1],center1[2]);
	printf("isoActor center:%f, %f ,%f \n",center2[0],center2[1],center2[2]);

isoActor->SetPosition(center1[0]-center2[0],center1[1]-center2[1],center1[2]-center2[2]);
//contourLabels->SetPosition(center1[0]-center2[0],center1[1]-center2[1],center1[2]-center2[2]);

	ren1->AddActor(demActor);
	ren1->SetBackground (1,1,1);
	ren1->AddActor2D(isoActor);
//	ren1->AddActor2D(contourLabels);

	iren->SetDesiredUpdateRate(5);

	//ren1->GetActiveCamera()->SetViewUp(0,0,1);
//	ren1->GetActiveCamera()->SetPosition(800000,0,31801);
	//ren1->GetActiveCamera()->SetFocalPoint(0,0,2815);
	//ren1->GetActiveCamera()->Dolly(5);
	ren1->ResetCamera();


	renWin->Render();
	iren->Start();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -