vtk随鼠标运动实时画支线

匿名 (未验证) 提交于 2019-12-03 00:26:01
#include <vtkRenderWindow.h>   #include <vtkRenderWindowInteractor.h>   #include <vtkRenderer.h>   #include <vtkSphereSource.h>   #include <vtkPolyDataMapper.h>   #include <vtkActor.h>   #include <vtkSmartPointer.h>   #include <vtkPointPicker.h>   #include <vtkCamera.h>   #include <vtkInteractorStyleTrackballCamera.h>   #include <vtkNamedColors.h>   #include <vtkObjectFactory.h>   #include<vtkLine.h>   #include<vtkProperty.h>   #include<vtkPolyLine.h>   #include<vtkUnstructuredGrid.h>   #include<vtkDataSetMapper.h>   #include<vtkLineSource.h>   #include<vtkRendererCollection.h>   #include<vtkCellPicker.h>   #include "vtkAutoInit.h"    VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2   VTK_MODULE_INIT(vtkInteractionStyle); // Define interaction style   vtkSmartPointer<vtkRenderer> renderer; double point1[3]{ 0 }; double point2[3]{ 0 }; double WorldPoint[3]{ 0 }; double WorldPoint1[3]{ 0 }; int *clickPos; int *clickPos1; int *movePos; vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New(); class customMouseInteractorStyle : public vtkInteractorStyleTrackballCamera { public: 	static customMouseInteractorStyle* New(); 	vtkTypeMacro(customMouseInteractorStyle, vtkInteractorStyleTrackballCamera); 	virtual void OnLeftButtonDown() 	{ 		std::cout << "Pressed left mouse button." << std::endl; 		// Forward events   		//  vtkInteractorStyleTrackballCamera::OnLeftButtonDown();   		//      int* clickPos = this->GetInteractor()->GetEventPosition();   		clickPos = this->GetInteractor()->GetEventPosition();  		point1[0] = clickPos[0]; 		point1[1] = clickPos[1];  		renderer->SetDisplayPoint(point1[0], point1[1], 0); 		renderer->DisplayToWorld(); 		WorldPoint[0] = (renderer->GetWorldPoint())[0]; 		WorldPoint[1] = (renderer->GetWorldPoint())[1]; 		WorldPoint[2] = (renderer->GetWorldPoint())[2];  		//      double* worldPosition = picker->GetPickPosition();   		//  std::cout << worldPosition[0] << "\t" << worldPosition[1] << std::endl;   		//  std::cout << WorldPoint[0]<< std::endl << WorldPoint[1]<<  std::endl;   	} 	virtual void OnLeftButtonUp() 	{ 		std::cout << "Pressed left mouse up." << std::endl; 		vtkIdType  pts[2]{ 0,1 }; 		// Forward events   		//  vtkInteractorStyleTrackballCamera::OnLeftButtonDown();   		//      int* clickPos = this->GetInteractor()->GetEventPosition();   		clickPos1 = this->GetInteractor()->GetEventPosition(); 		point2[0] = clickPos1[0]; 		point2[1] = clickPos1[1]; 		//      std::cout << clickPos[0] << std::endl << clickPos[1] << std::endl  << std::endl ;   		std::cout << point1[0] << std::endl << point1[1] << std::endl; 		std::cout << clickPos1[0] << std::endl << clickPos1[1] << std::endl;  		renderer->SetDisplayPoint(point2[0], point2[1], 0); 		renderer->DisplayToWorld(); 		WorldPoint1[0] = (renderer->GetWorldPoint())[0]; 		WorldPoint1[1] = (renderer->GetWorldPoint())[1]; 		WorldPoint1[2] = (renderer->GetWorldPoint())[2];   		lineSource->SetPoint1(WorldPoint); 		lineSource->SetPoint2(WorldPoint1);  		mapper->SetInputConnection(lineSource->GetOutputPort()); 		actor1->SetMapper(mapper); 		actor1->GetProperty()->SetColor(1.0, 0.0, 0.0);  		//  actor1->SetOrigin(0, 0,0);   		this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor1); 		renderer->GetRenderWindow()->GetInteractor()->Initialize(); 		renderer->GetRenderWindow()->GetInteractor()->Render(); 	}  	virtual void OnMiddleButtonDown() 	{ 		std::cout << "Pressed middle mouse button." << std::endl; 		// Forward events   		vtkInteractorStyleTrackballCamera::OnMiddleButtonDown(); 	}  	virtual void OnRightButtonDown() 	{ 		std::cout << "Pressed right mouse button." << std::endl; 		// Forward events   		vtkInteractorStyleTrackballCamera::OnRightButtonDown(); 	}  	virtual void OnMouseMove() 	{ 		if (clickPos == nullptr) return; 		vtkIdType  pts[2]{ 0,1 }; 		// Forward events   		//  vtkInteractorStyleTrackballCamera::OnMouseMove();   		movePos = this->GetInteractor()->GetEventPosition(); 		point2[0] = movePos[0]; 		point2[1] = movePos[1]; 		//      std::cout << clickPos[0] << std::endl << clickPos[1] << std::endl  << std::endl ;   		std::cout << point1[0] << std::endl << point1[1] << std::endl; 		std::cout << movePos[0] << std::endl << movePos[1] << std::endl; 		// 		renderer->SetDisplayPoint(point2[0], point2[1], 0); 		renderer->DisplayToWorld(); 		WorldPoint1[0] = (renderer->GetWorldPoint())[0]; 		WorldPoint1[1] = (renderer->GetWorldPoint())[1]; 		WorldPoint1[2] = (renderer->GetWorldPoint())[2];  		lineSource->SetPoint1(WorldPoint); 		lineSource->SetPoint2(WorldPoint1); 		mapper->SetInputConnection(lineSource->GetOutputPort()); 		actor1->SetMapper(mapper); 		actor1->GetProperty()->SetColor(1.0, 0.0, 0.0);  		//  actor1->SetOrigin(0, 0,0);   		this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor1); 		renderer->GetRenderWindow()->GetInteractor()->Initialize(); 		renderer->GetRenderWindow()->GetInteractor()->Render();  	}  };  vtkStandardNewMacro(customMouseInteractorStyle);  int main(int, char *[]) {  	vtkSmartPointer<vtkSphereSource> sphereSource = 		vtkSmartPointer<vtkSphereSource>::New(); 	sphereSource->SetCenter(0.0, 0.0, 0.0); 	sphereSource->SetRadius(5.0); 	sphereSource->Update();  	vtkSmartPointer<vtkPolyDataMapper> mapper = 		vtkSmartPointer<vtkPolyDataMapper>::New(); 	mapper->SetInputConnection(sphereSource->GetOutputPort());  	vtkSmartPointer<vtkActor> actor = 		vtkSmartPointer<vtkActor>::New(); 	actor->SetMapper(mapper);  	vtkSmartPointer<vtkNamedColors> colors = 		vtkSmartPointer<vtkNamedColors>::New();  	renderer = 		vtkSmartPointer<vtkRenderer>::New(); 	renderer->SetBackground(colors->GetColor3d("Slate_grey").GetData()); 	renderer->AddActor(actor);  	vtkSmartPointer<vtkRenderWindow> renderWindow = 		vtkSmartPointer<vtkRenderWindow>::New(); 	renderWindow->AddRenderer(renderer);  	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 		vtkSmartPointer<vtkRenderWindowInteractor>::New(); 	renderWindowInteractor->SetRenderWindow(renderWindow);  	vtkSmartPointer<customMouseInteractorStyle> style = 		vtkSmartPointer<customMouseInteractorStyle>::New(); 	renderWindowInteractor->SetInteractorStyle(style);  	renderWindowInteractor->Initialize(); 	renderWindowInteractor->Start();  	return EXIT_SUCCESS; }

#include <vtkSmartPointer.h> #include <vtkObjectFactory.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkCommand.h> #include <vtkWorldPointPicker.h> #include <vtkProperty.h> #include <vtkRendererCollection.h> #include <vtkLineSource.h> #include <vtkInteractorStyle.h>   class DrawLineCommand : public vtkCommand { public: 	static DrawLineCommand *New() 	{ 		return new DrawLineCommand; 	}   	void DrawLineCommand::SetInteractor(vtkRenderWindowInteractor* interactor) 	{ 		m_interactor = interactor; 	}   	virtual void Execute(vtkObject*, unsigned long eventId, void*) 	{ 		vtkSmartPointer<vtkWorldPointPicker>pointPicker = vtkSmartPointer<vtkWorldPointPicker>::New(); 		double pickPos[3] = { 0,0,0 }; 		m_interactor->SetPicker(pointPicker);  		switch (eventId) 		{ 		case vtkCommand::RightButtonPressEvent: 			MouseMotion = 1; 			m_interactor->GetPicker()->Pick(m_interactor->GetEventPosition()[0], 				m_interactor->GetEventPosition()[1], 0, 				m_interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()); 			m_interactor->GetPicker()->GetPickPosition(pickPos); 			pt1[0] = pickPos[0]; 			pt1[1] = pickPos[1]; 			pt1[2] = pickPos[2]; 			break;  		case vtkCommand::RightButtonReleaseEvent: 			MouseMotion = 0; 			break;  		case vtkCommand::MouseMoveEvent: 			if (MouseMotion) 			{ 				m_interactor->GetPicker()->Pick(m_interactor->GetEventPosition()[0], 					m_interactor->GetEventPosition()[1], 0, 					m_interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()); 				m_interactor->GetPicker()->GetPickPosition(pickPos); 				pt2[0] = pickPos[0]; 				pt2[1] = pickPos[1]; 				pt2[2] = pickPos[2];  				line->SetPoint1(pt1); 				line->SetPoint2(pt2); 				line->Update(); 				mapper->SetInputData(line->GetOutput()); 				mapper->Update(); 				actor->SetMapper(mapper); 				actor->GetProperty()->SetColor(pt2); 				m_interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor); 				m_interactor->GetRenderWindow()->Render(); 			} 			break; 		} 	} 	vtkRenderWindowInteractor* m_interactor; 	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); 	vtkSmartPointer<vtkLineSource> line = vtkSmartPointer<vtkLineSource>::New(); 	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();  	double pt1[3] = { 0,0,0 }, pt2[3] = { 0,0,0 }; 	int MouseMotion = 0; };  int main(int, char *[]) { 	// Create a sphere 	vtkSmartPointer<vtkSphereSource> sphereSource = 		vtkSmartPointer<vtkSphereSource>::New(); 	sphereSource->Update();  	// Create a mapper and actor 	vtkSmartPointer<vtkPolyDataMapper> mapper = 		vtkSmartPointer<vtkPolyDataMapper>::New(); 	mapper->SetInputConnection(sphereSource->GetOutputPort()); 	vtkSmartPointer<vtkActor> actor = 		vtkSmartPointer<vtkActor>::New(); 	actor->SetMapper(mapper);  	// Create a renderer, render window, and interactor 	vtkSmartPointer<vtkRenderer> renderer = 		vtkSmartPointer<vtkRenderer>::New(); 	vtkSmartPointer<vtkRenderWindow> renderWindow = 		vtkSmartPointer<vtkRenderWindow>::New(); 	renderWindow->AddRenderer(renderer); 	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 		vtkSmartPointer<vtkRenderWindowInteractor>::New(); 	renderWindowInteractor->SetRenderWindow(renderWindow);  	// Initialize must be called prior to creating timer events. 	renderWindowInteractor->Initialize(); 	renderWindowInteractor->CreateRepeatingTimer(500);  	vtkSmartPointer<vtkInteractorStyle> style = vtkSmartPointer<vtkInteractorStyle>::New(); 	renderWindowInteractor->SetInteractorStyle(style);   	vtkSmartPointer<DrawLineCommand> drawLineCallBack = 		vtkSmartPointer<DrawLineCommand>::New(); 	drawLineCallBack->SetInteractor(renderWindowInteractor); 	renderWindowInteractor->AddObserver(vtkCommand::RightButtonPressEvent, drawLineCallBack); 	renderWindowInteractor->AddObserver(vtkCommand::MouseMoveEvent, drawLineCallBack); 	renderWindowInteractor->AddObserver(vtkCommand::RightButtonReleaseEvent, drawLineCallBack);    	// Add the actor to the scene 	renderer->AddActor(actor); 	renderer->SetBackground(1, 1, 1); // Background color white  									  // Render and interact 	renderWindow->Render(); 	renderWindowInteractor->Start();  	return EXIT_SUCCESS; }

            
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!