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