Search code examples
projectionvtkcurveplane

how to project curve to a planar in vtk


I have used the vtkDijkstraGraphGeodesicPath class(example: http://www.cmake.org/Wiki/VTK/Examples/Cxx/PolyData/DijkstraGraphGeodesicPath) to find the shortest path between two points on a mesh, and my next step is to project the path(curve) to a planar. Is there a class or function in vtk to project curve to planar? And the other way is to sample the path(curve) and then project the sampled points to the planar, so how to sample the curve and get sampled points? Thank you in advance!‍


Solution

  • I never found a method doing the projection of 3D mesh, but I had to use it, and I selected texturizations methods allowing to project a mesh (to texzturize) on a Plane/Cylinder/Sphere.

    The main method used in this case is vtkTextureMapToPlane.

    // your mesh
    vtkSmartPointer<vtkPolyData> mainMesh = myFilter->GetOutput ();
    
    // extract your path from the poly data
    
    // retrieve selected ids from dijkstra algo
    vtkSmartPointer<vtkIdList> idList = dijkstra->GetIdList ();
    vtkSmartPointer<vtkIdTypeArray> ids = convertToIdTypeArr (idList); // custom method to convert id array
    
    // Once the ID selections is done, the extraction is invoked
    vtkSmartPointer<vtkSelectionNode> selectionNode = vtkSelectionNode::New ();
    selectionNode->SetFieldType (vtkSelectionNode::POINT);
    selectionNode->SetContentType (vtkSelectionNode::INDICES);
    selectionNode->SetSelectionList (ids);
    vtkSmartPointer<vtkSelection> selection = vtkSelection::New ();
    selection->AddNode (selectionNode);
    
    vtkSmartPointer<vtkExtractSelection> extract = vtkExtractSelection::New ();
    extract->SetInputData (0, pl);
    extract->SetInputData (1, selection);
    
    // convert result to polydata
    vtkSmartPointer<vtkGeometryFilter> geoFilter = vtkGeometryFilter::New ();
    geoFilter->SetInputConnection (extract->GetOutputPort());
    geoFilter->Update();
    vtkSmartPointer<vtkPolyData> selected = geoFilter->GetOutput();
    

    You have a vtkpolyData with vertices from the path. You need to create the plane and project

    // plane is sized with 800x600, on y-z directions
    double orig[3] = {0, 0, 0};
    double pt1[3] = {0, 600, 0};
    double pt2[3] = {0, 0, 800};
    
    // create TextureMapToPlan instance
    vtkSmartPointer<vtkTextureMapToPlane> planeMapper = vtkTextureMapToPlane::New ();
    planeMapper->SetOrigin(orig);
    planeMapper->SetPoint1(pt1);
    planeMapper->SetPoint2(pt2);
    
    planeMapper->SetInputData (selected);
    planeMapper->Update (); // project
    vtkSmartPointer<vtkPolyData> d = planeMapper->GetPolyDataOutput(); // retrieve result
    

    As this algorithm is used for texturization, you need to retrieve Texture coords, and convert them into the plane coordinates. (Text coords are defined in [0, 1] ratio of the height and width)

    vtkSmartPointer<vtkDataArray> textCoord = d->GetPointData()->GetTCoords ();
    vtkSmartPointer <vtkPoints> textPoints = vtkPoints::New ();
    for (int i = 0; i < textCoord->GetNumberOfTuples (); ++i)
     {
        textPoints->InsertNextPoint (textCoord->GetTuple2(i)[0] * 800,
                                       textCoord->GetTuple2(i)[1] * 600, 0);
     }
    

    textPoints got here all coordinates in 2 dimension of the projection of your path on the plane. /!\ This coords depends on your plane coordinates.