Я использовал класс vtkDijkstraGraphGeodesicPath
(пример: http://www.cmake.org/Wiki/VTK/Examples/Cxx/PolyData/DijkstraGraphGeodesicPath), чтобы найти кратчайший путь между двумя точками на сетке, а мой следующий шаг - проецировать путь (кривую) на плоскость , Есть ли класс или функция в vtk, чтобы проектировать кривую в плоскость? И другим способом является выборка пути (кривая), а затем проецирование выбранных точек на плоскость, поэтому как пробовать кривую и получать выборочные точки? Заранее благодарю вас!Как проецировать кривую на плоскость в vtk
1
A
ответ
1
Я никогда не нашел метод, выполняющий проекцию 3D-сетки, но мне пришлось использовать его, и я выбрал методы текстурирования, позволяющие проецировать сетку (toxzturize) на плоскость/цилиндр/сферу ,
Основным методом, используемым в этом случае, является 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();
У вас есть vtkpolyData
с вершинами из пути. Вам нужно создать плоскость и проект
// 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
Поскольку этот алгоритм используется для текстурирования, вам нужно получить текстуры COORDS, и преобразовывать их в координаты самолета. (Текст Coords определены в [0, 1] соотношение высоты и ширины)
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
получил здесь все координаты в 2 размерности проекции вашего пути на плоскости. /! \ Эти координаты зависят от ваших координат плоскости.