<div dir="ltr">I have a mesh in vtk.  I created a function to convert the mesh to point cloud library pcl::PointCloud.<div><br></div><div><div>int vtk2pcl(vtkPolyData* poly_data, pcl::PointCloud<pcl::PointXYZ>::Ptr& pcl_cloud)</div><div>{</div><div>  pcl_cloud->clear();</div><div><br></div><div>  vtkSmartPointer<vtkPoints> mesh_points = poly_data->GetPoints();</div><div>  vtkIdType nr_points = mesh_points->GetNumberOfPoints();</div><div>  if (nr_points == 0)</div><div>    return 0;</div><div><br></div><div>  pcl_cloud->points.resize(nr_points);</div><div>  double point_xyz[3];</div><div>  for (vtkIdType i = 0; i < mesh_points->GetNumberOfPoints(); ++i)</div><div>  {</div><div>    mesh_points->GetPoint(i, &point_xyz[0]);</div><div>    pcl_cloud->points[i].x = static_cast<float>(point_xyz[0]);</div><div>    pcl_cloud->points[i].y = static_cast<float>(point_xyz[1]);</div><div>    pcl_cloud->points[i].z = static_cast<float>(point_xyz[2]);</div><div>  }</div><div>  pcl_cloud->width = static_cast<uint32_t>(pcl_cloud->points.size());</div><div>  pcl_cloud->height = 1;</div><div>  pcl_cloud->is_dense = true;</div><div><br></div><div>  return (static_cast<int>(nr_points));</div><div>}</div></div><div><br></div><div>I then use this point cloud in PCL's segmentation methods to find planes in my mesh.</div><div><br></div><div>If I compare the bounds and centroid of my mesh to my point cloud - both are equal.</div><div><br></div><div>I display the planes in VTK:</div><div><br></div><div><div>auto A = plane[0];</div><div>auto B = plane[1];</div><div>auto C = plane[2];</div><div>auto D = plane[3];</div></div><div>double z = (-1 * D) / (-1 * ((A * min_x) + (B * 1)) * C);</div><div>plane_source->SetCenter(min_x, 1, z); <br></div><div><div>z = (-1 * D) / (-1 * ((A * min_x) + (B * max_y)) * C);</div><div>plane_source->SetPoint1(min_x, max_y, z);</div></div><div><div>z = (-1 * D) / (-1 * ((A * max_x) + (B * max_y)) * C);</div><div>plane_source->SetPoint2(max_x, max_y, z);</div></div><div><br></div><div><div>plane_source->Update();</div><div><br></div><div>vtkPolyData* vtk_plane = plane_source->GetOutput();</div><div>// Create a mapper and actor<br></div><div>vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();</div><div>mapper->SetInputData(vtk_plane);</div><div>vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();</div><div>actor->SetMapper(mapper);</div></div><div><br></div><div><br></div><div>I display the mesh in VTK:</div><div><br></div><div>// vtkPolyData* mesh ....</div><div>auto mesh_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();<br></div><div>mesh_mapper->SetInputData(mesh);<br></div><div>auto mesh_actor = vtkSmartPointer<vtkActor>::New();<br></div><div>mesh_actor->SetMapper(mesh_mapper.GetPointer());<br></div><div><br></div><div>renderer->AddActor(mesh_actor);<br></div><div><br></div><div><br></div><div>VTK shows my planes but the mesh and planes aren't aligned correctly.  Shouldn't they be aligned since my bounds and centroid are equal?  How do they get unaligned?</div><div><br></div></div>