VTK Learning Fourteen - VTK Drawing Lines

VTK Learning Fourteen - VTK Drawing Lines

Description

鼠标交互式画线段(vtkLine)。

Code


#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPolyDataMapper.h>
#include <vtkPointPicker.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>

#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkVertex.h>
#include <vtkCellArray.h>
#include <vtkLine.h>
 
// Handle mouse events
class MouseInteractorDrawing : public vtkInteractorStyleTrackballCamera
{
public:
  static MouseInteractorDrawing* New();
  vtkTypeMacro(MouseInteractorDrawing, vtkInteractorStyleTrackballCamera);
 
  MouseInteractorDrawing()
  {
	m_actor = vtkSmartPointer<vtkActor>::New();
	m_polydata = vtkPolyData::New();
	m_polydata->SetPoints(vtkSmartPointer<vtkPoints>::New());
	m_polydata->SetVerts(vtkSmartPointer<vtkCellArray>::New());
	m_polydata->SetLines(vtkSmartPointer<vtkCellArray>::New());
	
	m_actor->GetProperty()->SetColor(1, 0, 0);
	m_actor->GetProperty()->SetPointSize(5);

  }
  virtual ~MouseInteractorDrawing()
  {

  }
  virtual void OnLeftButtonUp() {
	  int num = m_polydata->GetNumberOfPoints();
	  if (num>1) {
		  vtkCellArray *cells = m_polydata->GetLines();
		  vtkSmartPointer<vtkLine>line = vtkSmartPointer<vtkLine>::New();
		  line->GetPointIds()->SetId(0, num - 2);
		  line->GetPointIds()->SetId(1, num-1);
		  cells->InsertNextCell(line);
		  vtkNew<vtkPolyDataMapper>mapper;
		  mapper->SetInputData(m_polydata);
		  m_actor->SetMapper(mapper);
	  }
	 vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
  }
  virtual void OnLeftButtonDown()
  {
	  int x = GetInteractor()->GetEventPosition()[0];
	  int y = GetInteractor()->GetEventPosition()[1];
	  double position[3] = { 0 };
	  // Pick from this location.
	  vtkSmartPointer<vtkPointPicker>  picker =
		  vtkSmartPointer<vtkPointPicker>::New();
	  picker->SetTolerance(0.001);
	  picker->Pick(x, y, 0, GetDefaultRenderer());

	  picker->GetPickPosition(position);

	  vtkPoints *points = m_polydata->GetPoints();
	  vtkIdType idx=points->InsertNextPoint(position);
	  vtkCellArray *cells = m_polydata->GetVerts();
	  vtkNew<vtkVertex> vertex;
	  vertex->GetPointIds()->InsertNextId(idx);
	  cells->InsertNextCell(vertex);

	  vtkNew<vtkPolyDataMapper>mapper;
	  mapper->SetInputData(m_polydata);
	  m_actor->SetMapper(mapper);

	  vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
  }
  virtual void OnMoveMove() {
	  vtkInteractorStyleTrackballCamera::OnMouseMove();
  }
  virtual void OnRightButtonDown() {
	  vtkInteractorStyleTrackballCamera::OnRightButtonDown();
  }

  void Init() {
	  GetDefaultRenderer()->AddActor(m_actor);
  }
 
private:

  vtkSmartPointer<vtkPolyData> m_polydata;
  vtkSmartPointer<vtkActor> m_actor;
};
 
vtkStandardNewMacro(MouseInteractorDrawing);
 
// Execute application.
int main(int argc, char *argv[])
{
  
  // A renderer and render window
  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer ( renderer );
 
  // An interactor
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow ( renderWindow );
 
  // Set the custom type to use for interaction.
  vtkSmartPointer<MouseInteractorDrawing> style =
    vtkSmartPointer<MouseInteractorDrawing>::New();
  style->SetDefaultRenderer(renderer);
  style->Init();
  renderWindowInteractor->SetInteractorStyle( style );
 
 
  renderer->SetBackground ( .3, .4, .5 );
 
  // Render and interact
  renderWindow->Render();
  renderWindowInteractor->Initialize();
  renderWindowInteractor->Start();
 
  return EXIT_SUCCESS;
}


CMakeLists.txt


CMAKE_MINIMUM_REQUIRED(VERSION 3.3 FATAL_ERROR)
PROJECT(DrawLine)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(DrawLine DrawLine.cxx)
TARGET_LINK_LIBRARIES(DrawLine  ${VTK_LIBRARIES})

Result

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值