level 1
请问dijkstra->SetRepelVertices(points);的用法是排除含这些点的路径吗,为啥我用了感觉没有什么用啊,我想求经过一系列特定点的路径。请问有什么方法吗
2016年12月27日 03点12分
1
level 1
我在mesh中提取出了一系列的点,想找这些点中某两个点的最短路径,其中最短路径必须只能经过提取出来的点,不能包含其他的点,我的做法是利用这些点,重建一个polydata,但是重建后由于要形成三角网格,就会多出一些点,我用dijkstra->SetRepelVertices(points);就是想路径中排除这些多余的点
2016年12月27日 03点12分
3
level 1
代码如下:
#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkInformation.h>
#include <vtkSphereSource.h>
#include <vtkExtractSelection.h>
#include <vtkSelection.h>
#include <vtkSelectionNode.h>
#include <vtkPolyData.h>
#include <vtkUnstructuredGrid.h>
#include <vtkIdTypeArray.h>
#include <vtkDataSetMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkVertexGlyphFilter.h>
#include "vtkCurvatures.h"
#include "vtkSTLReader.h"
#include "vtkIdList.h"
#include "vtkIdTypeArray.h"
#include "vtkPoints.h"
#include "vtkPointData.h"
#include "vtkKdTree.h"
#include <vtkVertexGlyphFilter.h>
#include "vtkKdTreePointLocator.h"
#include "extract.h"
#include <vtkSphereSource.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkDataSetSurfaceFilter.h>
#include "vtkGeometryFilter.h"
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkDijkstraGraphGeodesicPath.h>
//根据点提取出mesh的一部分
int extract(vtkSmartPointer<vtkCurvatures>filter, vtkSmartPointer<vtkIdList>idss)
{
vtkSmartPointer<vtkIdTypeArray> ids =
vtkSmartPointer<vtkIdTypeArray>::New();
ids->SetNumberOfComponents(1);
// Set values
int num = idss->GetNumberOfIds();
cout << "输入点的个数"<<num << endl;
for (vtkIdType i = 0; i <num ; i++)
{
int id = idss->GetId(i);
ids->InsertNextValue(id);
cout << id << endl;
}
vtkSmartPointer<vtkSelectionNode> selectionNode = vtkSmartPointer<vtkSelectionNode>::New();
selectionNode->SetFieldType(vtkSelectionNode::POINT);
selectionNode->SetContentType(vtkSelectionNode::INDICES);
selectionNode->SetSelectionList(ids);
selectionNode->GetProperties()->Set(vtkSelectionNode::CONTAINING_CELLS(),1);
vtkSmartPointer<vtkSelection> selection =
vtkSmartPointer<vtkSelection>::New();
selection->AddNode(selectionNode);
vtkSmartPointer<vtkExtractSelection> extractSelection =
vtkSmartPointer<vtkExtractSelection>::New();
extractSelection->SetInputConnection(0, filter->GetOutputPort());
extractSelection->SetInputData(1, selection);
extractSelection->Update();
vtkSmartPointer<vtkUnstructuredGrid> selected =
vtkSmartPointer<vtkUnstructuredGrid>::New();
selected->ShallowCopy(extractSelection->GetOutput());
//将原来的点与现在的点联系起来,保存原来没有的id
vtkIdTypeArray* originalIds = vtkIdTypeArray::SafeDownCast(selected->GetPointData()->GetArray("vtkOriginalPointIds"));
vtkSmartPointer<vtkIdList>originIds = vtkSmartPointer<vtkIdList>::New();
vtkSmartPointer<vtkIdTypeArray> deleteids = vtkSmartPointer<vtkIdTypeArray>::New();
//将IdTypeArray to vtkIdList
for (int i = 0; i < originalIds->GetNumberOfTuples();i++)
{
int oid = originalIds->GetValue(i);
originIds->InsertNextId(oid);
}
//判断重建后多出来的点
int result = 0;
for (int i = 0; i < originIds->GetNumberOfIds();i++)
{
int oid = originIds->GetId(i);
result = idss->IsId(oid);
if (result==-1)
{
deleteids->InsertNextValue(oid);
}
}
//多出来的点在新的polydata中的标号
vtkSmartPointer<vtkIdTypeArray> newdeleteids = vtkSmartPointer<vtkIdTypeArray>::New();
for (vtkIdType i = 0; i < deleteids->GetNumberOfTuples(); i++)
{
vtkIdType query = deleteids->GetValue(i);
for (vtkIdType j = 0; j < originalIds->GetNumberOfTuples(); j++)
{
if (originalIds->GetValue(j) == query)
{
//std::cout << "Original point " << query << " is now " << j << std::endl;
newdeleteids->InsertNextValue(j);
}
}
}
//将UnstructuredGrid转为polydata
vtkSmartPointer<vtkDataSetSurfaceFilter> surfaceFilter =
vtkSmartPointer<vtkDataSetSurfaceFilter>::New();
surfaceFilter->SetInputData(selected);
surfaceFilter->Update();
vtkSmartPointer<vtkPolyData>polydata = vtkSmartPointer<vtkPolyData>::New();
polydata = surfaceFilter->GetOutput();
//
vtkSmartPointer<vtkPoints>points = vtkSmartPointer<vtkPoints>::New();
for (int i = 0; i <newdeleteids ->GetNumberOfTuples();i++)
{
int id = newdeleteids->GetValue(i);
cout << "多出的点" << id << endl;
double cor[3];
selected->GetPoint(id, cor);
//polydata->GetPoint(id, cor);
points->InsertNextPoint(cor);
}
cout << newdeleteids->GetNumberOfTuples()<<endl;
//points->GetNumberOfPoints();
//selected->getn
//求最短路径
vtkSmartPointer<vtkDijkstraGraphGeodesicPath> dijkstra =
vtkSmartPointer<vtkDijkstraGraphGeodesicPath>::New();
dijkstra->SetInputData(polydata);
dijkstra->SetRepelVertices(points);//这句话为啥不起作用呢
//dijkstra->
int i = polydata->GetNumberOfPoints();
cout <<"重建后点的个数"<< i << endl;
dijkstra->SetStartVertex(0);
dijkstra->SetEndVertex(i-1);
dijkstra->Update();
// Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> pathMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
pathMapper->SetInputConnection(dijkstra->GetOutputPort());
vtkSmartPointer<vtkActor> pathActor =
vtkSmartPointer<vtkActor>::New();
pathActor->SetMapper(pathMapper);
pathActor->GetProperty()->SetColor(0, 0, 1); // Red
pathActor->GetProperty()->SetLineWidth(4);
pathActor->GetProperty()->SetRepresentationToWireframe();
//curvaturefilter 的mapper and actor
vtkSmartPointer<vtkPolyDataMapper> filterMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
filterMapper->SetInputConnection(filter->GetOutputPort());
vtkSmartPointer<vtkActor> filterActor =
vtkSmartPointer<vtkActor>::New();
filterActor->SetMapper(filterMapper);
filterActor->GetProperty()->SetRepresentationToWireframe();
vtkSmartPointer<vtkDataSetMapper> selectedMapper =
vtkSmartPointer<vtkDataSetMapper>::New();
selectedMapper->SetInputData(selected);
vtkSmartPointer<vtkActor> selectedActor =
vtkSmartPointer<vtkActor>::New();
selectedActor->SetMapper(selectedMapper);
selectedActor->GetProperty()->SetColor(0, 0, 1);
// There will be one render window
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
// And one interactor
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
vtkSmartPointer<vtkRenderer> centerRenderer =
vtkSmartPointer<vtkRenderer>::New();
renderWindow->AddRenderer(centerRenderer);
centerRenderer->AddActor(filterActor);
centerRenderer->AddActor(pathActor);
//centerRenderer->AddActor(selectedActor);
centerRenderer->SetBackground(.3, .6, .3);
renderWindow->Render();
interactor->Start();
return 0;
}
2016年12月27日 04点12分
4
幸苦贴这么长代码~
2016年12月30日 03点12分
@rabbitbride 还好,粘贴复制而已,辛苦吧主看,最近提了几个问题,已知一直在等吧主上线
2016年12月30日 04点12分
level 12
经过特定点的最短路径规划?
这个类我没怎么用过~
稍等,去看看
2016年12月30日 03点12分
6