VTK鼠标选点
2015-10-07 16:35
1231 查看
打开点云后用鼠标选点并输出选中点信息:
#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkRendererCollection.h>
#include <vtkDataSetMapper.h>
#include <vtkUnstructuredGrid.h>
#include <vtkIdTypeArray.h>
#include <vtkTriangleFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCommand.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPlaneSource.h>
#include <vtkCellPicker.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkProperty.h>
#include <vtkSelectionNode.h>
#include <vtkSelection.h>
#include <vtkExtractSelection.h>
#include <vtkObjectFactory.h>
#include <vtkPointSource.h>
#include <vtkDoubleArray.h>
#include <vtkPoints.h>
#include <vtkPointData.h>
//#include "vtkHeadFile.h"
// Catch mouse events
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
static MouseInteractorStyle* New();
MouseInteractorStyle()
{
selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
selectedActor = vtkSmartPointer<vtkActor>::New();
}
virtual void OnLeftButtonDown()
{
// Get the location of the click (in window coordinates)
int* pos = this->GetInteractor()->GetEventPosition();
vtkSmartPointer<vtkCellPicker> picker =
vtkSmartPointer<vtkCellPicker>::New();
picker->SetTolerance(/*0.0005*/ 0.001);
// Pick from this location.
picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
double* worldPosition = picker->GetPickPosition();
std::cout << "Cell id is: " << picker->GetCellId() << std::endl;
if(picker->GetCellId() != -1)
{
std::cout << "Pick position is: " << worldPosition[0] << " " << worldPosition[1]
<< " " << worldPosition[2] << endl;
vtkSmartPointer<vtkIdTypeArray> ids =
vtkSmartPointer<vtkIdTypeArray>::New();
ids->SetNumberOfComponents(1);
ids->InsertNextValue(picker->GetCellId());
vtkSmartPointer<vtkSelectionNode> selectionNode =
vtkSmartPointer<vtkSelectionNode>::New();
selectionNode->SetFieldType(vtkSelectionNode::CELL);
selectionNode->SetContentType(vtkSelectionNode::INDICES);
selectionNode->SetSelectionList(ids);
vtkSmartPointer<vtkSelection> selection =
vtkSmartPointer<vtkSelection>::New();
selection->AddNode(selectionNode);
vtkSmartPointer<vtkExtractSelection> extractSelection =
vtkSmartPointer<vtkExtractSelection>::New();
#if VTK_MAJOR_VERSION <= 5
extractSelection->SetInput(0, this->Data);
extractSelection->SetInput(1, selection);
#else
extractSelection->SetInputData(0, this->Data);
extractSelection->SetInputData(1, selection);
#endif
extractSelection->Update();
// In selection
vtkSmartPointer<vtkUnstructuredGrid> selected =
vtkSmartPointer<vtkUnstructuredGrid>::New();
selected->ShallowCopy(extractSelection->GetOutput());
std::cout << "There are " << selected->GetNumberOfPoints()
<< " points in the selection." << std::endl;
std::cout << "There are " << selected->GetNumberOfCells()
<< " cells in the selection." << std::endl;
#if VTK_MAJOR_VERSION <= 5
selectedMapper->SetInputConnection(
selected->GetProducerPort());
#else
selectedMapper->SetInputData(selected);
#endif
selectedActor->SetMapper(selectedMapper);
selectedActor->GetProperty()->EdgeVisibilityOn();
selectedActor->GetProperty()->SetEdgeColor(1,0,0);
selectedActor->GetProperty()->SetLineWidth(3);
selectedActor->GetProperty()->SetPointSize(10);
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
}
// Forward events
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
vtkSmartPointer<vtkPolyData> Data;
vtkSmartPointer<vtkDataSetMapper> selectedMapper;
vtkSmartPointer<vtkActor> selectedActor;
};
vtkStandardNewMacro(MouseInteractorStyle);
int main (int, char *[])
{
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkDoubleArray> scalar = vtkSmartPointer<vtkDoubleArray>::New();//用高程值(Z坐标值)填充,用于显示
//读取文件,将点云存储在vtkPoints对象中,并用高程值作为属性信息存储在vtkDoubleArray对象中
FILE * fRead;
fRead = fopen("d:\\03.txt","r");
double pt[3];
int n=0;
while (!feof(fRead))
{
fscanf(fRead,"%lf %lf %lf",pt,pt+1,pt+2);
points->InsertPoint(n,pt[0],pt[1],pt[2]);
scalar->InsertNextTuple1(pt[2]);
n++;
}
vtkSmartPointer<vtkCellArray> polyvertex = vtkSmartPointer<vtkCellArray>::New();//vtkCell的具体实现
polyvertex->SetNumberOfCells(n);//设置ID个数
int i = 0;
for(i=0;i<n;i++)//建立拓扑关系
{
vtkIdType Cell[1] = {i};
polyvertex->InsertNextCell(1,Cell);//第一个参数:cell由一个点组成;第二个参数:组成cell的pointID
}
vtkSmartPointer<vtkPolyData > grid = vtkSmartPointer<vtkPolyData>::New();
grid->SetPoints(points);
grid->SetVerts(polyvertex);//设置建立vertex的cell array
grid->GetPointData()->SetScalars(scalar);
double p[3];
grid->GetPoint(384456,p);
std::cout << "Point 384456"<< " : (" << p[0] << " " << p[1] << " " << p[2] << ")" << std::endl;
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
//mapper->SetInputConnection(planeSource->GetOutputPort());
mapper->SetInput(grid);
mapper->SetScalarRange(-2,20);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->GetProperty()->SetColor(0,1,0); //green
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindowInteractor->Initialize();
// Set the custom stype to use for interaction.
vtkSmartPointer<MouseInteractorStyle> style =
vtkSmartPointer<MouseInteractorStyle>::New();
style->SetDefaultRenderer(renderer);
style->Data = grid;
renderWindowInteractor->SetInteractorStyle(style);
renderer->AddActor(actor);
renderer->ResetCamera();
renderer->SetBackground(0,0,0); // Black
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkRendererCollection.h>
#include <vtkDataSetMapper.h>
#include <vtkUnstructuredGrid.h>
#include <vtkIdTypeArray.h>
#include <vtkTriangleFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCommand.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPlaneSource.h>
#include <vtkCellPicker.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkProperty.h>
#include <vtkSelectionNode.h>
#include <vtkSelection.h>
#include <vtkExtractSelection.h>
#include <vtkObjectFactory.h>
#include <vtkPointSource.h>
#include <vtkDoubleArray.h>
#include <vtkPoints.h>
#include <vtkPointData.h>
//#include "vtkHeadFile.h"
// Catch mouse events
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
static MouseInteractorStyle* New();
MouseInteractorStyle()
{
selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
selectedActor = vtkSmartPointer<vtkActor>::New();
}
virtual void OnLeftButtonDown()
{
// Get the location of the click (in window coordinates)
int* pos = this->GetInteractor()->GetEventPosition();
vtkSmartPointer<vtkCellPicker> picker =
vtkSmartPointer<vtkCellPicker>::New();
picker->SetTolerance(/*0.0005*/ 0.001);
// Pick from this location.
picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
double* worldPosition = picker->GetPickPosition();
std::cout << "Cell id is: " << picker->GetCellId() << std::endl;
if(picker->GetCellId() != -1)
{
std::cout << "Pick position is: " << worldPosition[0] << " " << worldPosition[1]
<< " " << worldPosition[2] << endl;
vtkSmartPointer<vtkIdTypeArray> ids =
vtkSmartPointer<vtkIdTypeArray>::New();
ids->SetNumberOfComponents(1);
ids->InsertNextValue(picker->GetCellId());
vtkSmartPointer<vtkSelectionNode> selectionNode =
vtkSmartPointer<vtkSelectionNode>::New();
selectionNode->SetFieldType(vtkSelectionNode::CELL);
selectionNode->SetContentType(vtkSelectionNode::INDICES);
selectionNode->SetSelectionList(ids);
vtkSmartPointer<vtkSelection> selection =
vtkSmartPointer<vtkSelection>::New();
selection->AddNode(selectionNode);
vtkSmartPointer<vtkExtractSelection> extractSelection =
vtkSmartPointer<vtkExtractSelection>::New();
#if VTK_MAJOR_VERSION <= 5
extractSelection->SetInput(0, this->Data);
extractSelection->SetInput(1, selection);
#else
extractSelection->SetInputData(0, this->Data);
extractSelection->SetInputData(1, selection);
#endif
extractSelection->Update();
// In selection
vtkSmartPointer<vtkUnstructuredGrid> selected =
vtkSmartPointer<vtkUnstructuredGrid>::New();
selected->ShallowCopy(extractSelection->GetOutput());
std::cout << "There are " << selected->GetNumberOfPoints()
<< " points in the selection." << std::endl;
std::cout << "There are " << selected->GetNumberOfCells()
<< " cells in the selection." << std::endl;
#if VTK_MAJOR_VERSION <= 5
selectedMapper->SetInputConnection(
selected->GetProducerPort());
#else
selectedMapper->SetInputData(selected);
#endif
selectedActor->SetMapper(selectedMapper);
selectedActor->GetProperty()->EdgeVisibilityOn();
selectedActor->GetProperty()->SetEdgeColor(1,0,0);
selectedActor->GetProperty()->SetLineWidth(3);
selectedActor->GetProperty()->SetPointSize(10);
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
}
// Forward events
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
vtkSmartPointer<vtkPolyData> Data;
vtkSmartPointer<vtkDataSetMapper> selectedMapper;
vtkSmartPointer<vtkActor> selectedActor;
};
vtkStandardNewMacro(MouseInteractorStyle);
int main (int, char *[])
{
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkDoubleArray> scalar = vtkSmartPointer<vtkDoubleArray>::New();//用高程值(Z坐标值)填充,用于显示
//读取文件,将点云存储在vtkPoints对象中,并用高程值作为属性信息存储在vtkDoubleArray对象中
FILE * fRead;
fRead = fopen("d:\\03.txt","r");
double pt[3];
int n=0;
while (!feof(fRead))
{
fscanf(fRead,"%lf %lf %lf",pt,pt+1,pt+2);
points->InsertPoint(n,pt[0],pt[1],pt[2]);
scalar->InsertNextTuple1(pt[2]);
n++;
}
vtkSmartPointer<vtkCellArray> polyvertex = vtkSmartPointer<vtkCellArray>::New();//vtkCell的具体实现
polyvertex->SetNumberOfCells(n);//设置ID个数
int i = 0;
for(i=0;i<n;i++)//建立拓扑关系
{
vtkIdType Cell[1] = {i};
polyvertex->InsertNextCell(1,Cell);//第一个参数:cell由一个点组成;第二个参数:组成cell的pointID
}
vtkSmartPointer<vtkPolyData > grid = vtkSmartPointer<vtkPolyData>::New();
grid->SetPoints(points);
grid->SetVerts(polyvertex);//设置建立vertex的cell array
grid->GetPointData()->SetScalars(scalar);
double p[3];
grid->GetPoint(384456,p);
std::cout << "Point 384456"<< " : (" << p[0] << " " << p[1] << " " << p[2] << ")" << std::endl;
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
//mapper->SetInputConnection(planeSource->GetOutputPort());
mapper->SetInput(grid);
mapper->SetScalarRange(-2,20);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->GetProperty()->SetColor(0,1,0); //green
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindowInteractor->Initialize();
// Set the custom stype to use for interaction.
vtkSmartPointer<MouseInteractorStyle> style =
vtkSmartPointer<MouseInteractorStyle>::New();
style->SetDefaultRenderer(renderer);
style->Data = grid;
renderWindowInteractor->SetInteractorStyle(style);
renderer->AddActor(actor);
renderer->ResetCamera();
renderer->SetBackground(0,0,0); // Black
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
相关文章推荐
- FOJ有奖月赛-2015年10月(没有补完)
- Intellij Idea 将java项目打包成jar
- 老人出游经历分享
- IPV4网段划分
- POJ 1836 Alignment (简单DP)
- UVA_725: Division
- Python Linux下安装python 软件包
- 最小二乘法
- mysql修改配置文件
- android系统开发中log的使用方法
- [Java]collection类集中的Set接口
- Java Web 中使用ffmpeg实现视频转码、视频截图
- 【bzoj2660】【IOI2011】【ricehub】
- POJ 2032 搜索 (IDA*) 或 DLX
- css position 应用(absolute和relative用法)
- ETL 浅谈
- GCT学习总结
- Maven学习总结(四)——Maven核心概念
- 宗宁:如何工作一年获得三年的经验
- 约瑟夫环问题