<div>Hello</div>
<div>I want to use the class vtkPointPicker to pick a point in a pointcloud,but it doesn't work</div>
<div>Bellow is the snippet of my program,Please tell me what's the problem.</div>
<div>
<p>#include "vtkActor.h"<br>#include "vtkPolyData.h"<br>#include "vtkUnstructuredGrid.h"<br>#include "vtkRenderWindow.h"<br>#include "vtkRenderer.h"<br>#include "vtkPointPicker.h
"<br>#include "vtkRenderWindowInteractor.h"<br>#include "vtkPolyDataMapper.h"<br>#include "vtkSphereSource.h"<br>#include "vtkPolyDataReader.h"<br>#include "vtkPolyDataMapper.h
"<br>#include "vtkShrinkFilter.h"<br>#include "vtkDataSetMapper.h"<br>#include "vtkRenderWindowInteractor.h"<br>#include "vtkIdList.h"</p>
<p>static void PickCells(void *);<br>static vtkActor *sphereActor;<br>static vtkPolyData *plateOutput;<br>static vtkUnstructuredGrid *cells;<br>static vtkRenderWindow *renWin;<br>static vtkActor *cellsActor, *plateActor;
</p>
<p>//#include "SaveImage.h"</p>
<p>int main( int argc, char *argv[] )<br>{<br> vtkRenderer *renderer = vtkRenderer::New();<br> renWin = vtkRenderWindow::New();<br> renWin->AddRenderer(renderer);</p>
<p> vtkPointPicker *picker = vtkPointPicker::New();<br> picker->SetTolerance(0.01);</p>
<p> vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();<br> iren->SetRenderWindow(renWin);<br> iren->SetPicker(picker);</p>
<p> // read data file<br>// vtkPolyDataReader *plate = vtkPolyDataReader::New();<br> // plate->SetFileName("../../../vtkdata/plate.vtk");<br> //plate->DebugOn();<br> int t,s;<br> s = 0;<br> FILE *fpread;
<br> float point[3];<br> fpread = fopen("Inspection_Three.dat","r");<br> vtkPolyData *PolyData = vtkPolyData::New();<br> vtkPoints *pointsData = vtkPoints::New();<br> vtkCellArray *PointsArray = vtkCellArray::New();
<br> while(!feof(fpread))<br> {<br> for(t = 0;t < 3;t++)<br> {<br> fscanf(fpread,"%f",&point[t]);<br> }<br> pointsData->InsertPoint(s,point[0],point[1],point[2]);<br> <br> PointsArray->InsertNextCell(1);
<br> PointsArray->InsertCellPoint(s);</p>
<p> s++;<br> }</p>
<p> fclose(fpread);<br>// PolyData->SetPoints(pointsData);<br>// PolyData->SetVerts(PointsArray);<br> // plateOutput = plate->GetOutput();<br> plateOutput = vtkPolyData::New();<br> plateOutput->SetPoints(pointsData);
<br> plateOutput->SetVerts(PointsArray);<br> vtkPolyDataMapper *plateMapper = vtkPolyDataMapper::New();<br> plateMapper->SetInput(plateOutput);<br> plateActor = vtkActor::New();<br> plateActor->SetMapper(plateMapper);
<br> plateActor->GetProperty()->SetColor(0.5000,0.5400,0.5300);</p>
<p> // create marker for pick<br> vtkSphereSource *sphere = vtkSphereSource::New();<br> sphere->SetThetaResolution(8); sphere->SetPhiResolution(8);<br> sphere->SetRadius(0.01);<br> vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
<br> sphereMapper->SetInput(sphere->GetOutput());<br> sphereActor = vtkActor::New();<br> sphereActor->SetMapper(sphereMapper);<br> sphereActor->GetProperty()->SetColor(1,0,0);<br> sphereActor->PickableOff();
</p>
<p> // create actor and mapper to display picked cells<br> cells = vtkUnstructuredGrid::New();<br> vtkShrinkFilter *shrink = vtkShrinkFilter::New();<br> shrink->SetInput(cells);<br> shrink->SetShrinkFactor(
0.75);<br> vtkDataSetMapper *cellsMapper = vtkDataSetMapper::New();<br> cellsMapper->SetInput(shrink->GetOutput());<br> cellsActor = vtkActor::New();<br> cellsActor->SetMapper(cellsMapper);<br> cellsActor->PickableOff();
<br> cellsActor->VisibilityOff();<br> cellsActor->GetProperty()->SetColor(0.5000,0.5400,0.5300);</p>
<p> renderer->AddActor(cellsActor);<br> renderer->AddActor(plateActor);<br>// renderer->AddActor(sphereActor);<br> renderer->SetBackground(1,1,1);<br> renderer->GetActiveCamera()->Elevation(30.0);<br>
renderer->GetActiveCamera()->Azimuth(30.0);<br> renderer->GetActiveCamera()->Zoom(0.75);</p>
<p> renWin->SetSize(300,300);</p>
<p> // interact with data<br> renWin->Render();</p>
<p>// SAVEIMAGE( renWin );</p>
<p> iren->SetEndPickMethod(PickCells,(void *)iren);<br> iren->Start();</p>
<p> // Clean up<br> renderer->Delete();<br> renWin->Delete();<br> picker->Delete();<br> iren->Delete();<br>// plate->Delete();<br> plateMapper->Delete();<br> plateActor->Delete();<br> sphere->Delete();
<br> sphereMapper->Delete();<br> sphereActor->Delete();<br> cells->Delete();<br> shrink->Delete();<br> cellsMapper->Delete();<br> cellsActor->Delete();<br>}</p>
<p>static void PickCells(void *arg)<br>{<br> vtkRenderWindowInteractor *iren = (vtkRenderWindowInteractor *)arg;<br> vtkPointPicker *picker = (vtkPointPicker *)iren->GetPicker();<br> int i, cellId;<br> vtkIdList *cellIds = vtkIdList::New(); cellIds->Allocate(12);
<br> vtkIdList *ptIds = vtkIdList::New(); ptIds->Allocate(12);</p>
<p> sphereActor->SetPosition(picker->GetPickPosition());</p>
<p> if ( picker->GetPointId() >= 0 )<br> {<br> cout << "Point id: " << picker->GetPointId() << "\n";<br> cellsActor->VisibilityOn();<br> plateActor->VisibilityOff();
</p>
<p> cells->Initialize();<br> cells->Allocate(100);<br> cells->SetPoints(plateOutput->GetPoints());</p>
<p> plateOutput->GetPointCells(picker->GetPointId(), cellIds);<br> for (i=0; i < cellIds->GetNumberOfIds(); i++)<br> {<br> cellId = cellIds->GetId(i);<br> plateOutput->GetCellPoints(cellId, ptIds);
<br> cells->InsertNextCell(plateOutput->GetCellType(cellId), ptIds);<br> }<br> }<br> else<br> {<br> cellsActor->VisibilityOff();<br> plateActor->VisibilityOn();<br> }</p>
<p> renWin->Render();<br> cellIds->Delete();<br> ptIds->Delete();<br>}</p>
<p><br> </p></div>