2014-10-31 3 views
1

Я использовал класс vtkDijkstraGraphGeodesicPath (пример: http://www.cmake.org/Wiki/VTK/Examples/Cxx/PolyData/DijkstraGraphGeodesicPath), чтобы найти кратчайший путь между двумя точками на сетке, а мой следующий шаг - проецировать путь (кривую) на плоскость , Есть ли класс или функция в vtk, чтобы проектировать кривую в плоскость? И другим способом является выборка пути (кривая), а затем проецирование выбранных точек на плоскость, поэтому как пробовать кривую и получать выборочные точки? Заранее благодарю вас!Как проецировать кривую на плоскость в vtk

ответ

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 размерности проекции вашего пути на плоскости. /! \ Эти координаты зависят от ваших координат плоскости.

 Смежные вопросы

  • Нет связанных вопросов^_^