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

📄 cylinder.cxx

📁 VTK入门样例(种类齐全)
💻 CXX
字号:
#include "vtkActor.h" 
#include "vtkBYUReader.h" 
#include "vtkClipPolyData.h" 
#include "vtkCutter.h" 
#include "vtkPlane.h" 
#include "vtkPolyData.h" 
#include "vtkPolyDataMapper.h" 
#include "vtkPolyDataNormals.h" 
#include "vtkProperty.h" 
#include "vtkRenderWindow.h" 
#include "vtkRenderWindowInteractor.h" 
#include "vtkRenderer.h" 
#include "vtkStripper.h" 
#include "vtkTriangleFilter.h"

#include "vtkCamera.h" 
#include "vtkVolume16Reader.h"
#include "vtkContourFilter.h"
#include "vtkCommand.h"
#include "vtkCallbackCommand.h"
#include "vtkPlaneWidget.h"


vtkRenderWindow *renWin;
vtkPlane *plane;
vtkClipPolyData *clipper;
vtkPolyDataMapper *clipMapper;
vtkStripper *cutStrips;
vtkCutter *cutEdges;
vtkPolyData *cutPoly;
vtkPolyDataMapper *cutMapper;

void *m_viewer;

class vtkTPWCallback : public vtkCommand
{
public:
  static vtkTPWCallback *New() 
    { return new vtkTPWCallback; }

  virtual void Execute(vtkObject *caller, unsigned long, void*)
    {
      vtkPlaneWidget *planeWidget = reinterpret_cast<vtkPlaneWidget*>(caller);
      planeWidget->GetPolyData(this->PolyData);
	  planeWidget->GetPlane(Plane);   
    }

  vtkTPWCallback():PolyData(0),Plane(0) {}
  vtkPolyData *PolyData;
  vtkPlane *Plane;
};



void Test_vtkCutter()
{

	void Cut(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata);

	vtkBYUReader *cow = vtkBYUReader::New();
	cow->SetGeometryFileName("cow.g");

	vtkPolyDataNormals *cowNormals = vtkPolyDataNormals::New();
		cowNormals->SetInputConnection(cow->GetOutputPort());


	plane = vtkPlane::New();
      plane->SetOrigin(100, 100, 100);

	cutEdges = vtkCutter::New();
		cutEdges->SetInputConnection(cowNormals->GetOutputPort());
		cutEdges->SetCutFunction(plane);
		cutEdges->GenerateCutScalarsOn();
		cutEdges->SetValue(0, 0.5); 

	cutStrips = vtkStripper::New();
		cutStrips->SetInputConnection(cutEdges->GetOutputPort());
		cutStrips->Update();

	vtkPolyData *cutPoly = vtkPolyData::New();
		cutPoly->SetPoints(cutStrips->GetOutput()->GetPoints());
		cutPoly->SetPolys(cutStrips->GetOutput()->GetLines());

	vtkTriangleFilter *cutTriangles = vtkTriangleFilter::New();
		cutTriangles->SetInput(cutPoly);

	cutMapper = vtkPolyDataMapper::New();
		cutMapper->SetInput(cutPoly);
		cutMapper->SetInputConnection(cutTriangles->GetOutputPort());

	vtkActor *cutActor = vtkActor::New();
		cutActor->SetMapper(cutMapper);
		cutActor->GetProperty()->SetColor(0.0, 0.0, 1.0);//切割平面
		cutActor->GetProperty()->SetOpacity  (0.5)  ;

	clipper = vtkClipPolyData::New();
		clipper->SetInputConnection(cowNormals->GetOutputPort());
		clipper->SetClipFunction(plane);
		clipper->GenerateClipScalarsOn();
		clipper->GenerateClippedOutputOn();
//		clipper->SetValue(0.5);

	clipMapper = vtkPolyDataMapper::New();
		clipMapper->SetInputConnection(clipper->GetOutputPort());
		clipMapper->ScalarVisibilityOff();

	vtkProperty *backProp = vtkProperty::New();
		backProp->SetDiffuseColor(1.0, 0.0, 0.0);

	vtkActor *clipActor = vtkActor::New();
		clipActor->SetMapper(clipMapper);//切割后的图形
		clipActor->GetProperty()->SetColor(1.0, 0.6, 0.1);
		clipActor->SetBackfaceProperty(backProp);


	vtkPolyDataMapper *restMapper = vtkPolyDataMapper::New();
		restMapper->SetInput(clipper->GetClippedOutput());
		restMapper->ScalarVisibilityOff();

	vtkActor *restActor = vtkActor::New();
		restActor->SetMapper(restMapper);//原始图形
		restActor->GetProperty()->SetOpacity  (0.2)  ;


	vtkRenderer *ren1 = vtkRenderer::New();

	renWin = vtkRenderWindow::New();
		renWin->AddRenderer(ren1);

    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	    iren->SetRenderWindow(renWin);


    vtkTPWCallback *myCallback = vtkTPWCallback::New();
	    myCallback->PolyData = cutPoly;
	    myCallback->Plane = plane;


	vtkPlaneWidget *planeWidget = vtkPlaneWidget::New();
		planeWidget->SetInteractor(iren);
		planeWidget->SetInput(cowNormals->GetOutput());
		planeWidget->SetPlaceFactor(1.25);
		planeWidget->SetRepresentationToOutline();
		planeWidget->PlaceWidget();
		planeWidget->AddObserver(vtkCommand::InteractionEvent,myCallback);

planeWidget->On();

	ren1->AddActor(clipActor);
	ren1->AddActor(cutActor);
	ren1->AddActor(restActor);
	ren1->SetBackground(1, 1, 1);
	ren1->ResetCamera();
	ren1->GetActiveCamera()->Azimuth(30);
	ren1->GetActiveCamera()->Elevation(30);
	ren1->GetActiveCamera()->Dolly(1.5);
	ren1->ResetCameraClippingRange();


	renWin->SetSize(600, 600);

	renWin->Render();
iren->SetKeyCode('i');
	iren->Initialize();
	iren->SetKeyCode('i');
	iren->Start();

}

int main()
{
	Test_vtkCutter();
	return 0;
}

⌨️ 快捷键说明

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