详细流程:
#include <vtkSmartPointer.h>
#include <vtkTransform.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkIterativeClosestPointTransform.h>
#include <vtkTransformPolyDataFilter.h>
#include <vtkLandmarkTransform.h>
#include <vtkMath.h>
#include <vtkMatrix4x4.h>
#include <vtkXMLPolyDataWriter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkProperty.h>
int main(int argc, char *argv[]) {
vtkSmartPointer<vtkPolyData> source =
vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPolyData> target =
vtkSmartPointer<vtkPolyData>::New();
std::string filename = "../data/f_9";
std::ifstream filestream(filename.c_str());
std::string line;
vtkSmartPointer<vtkPoints> m_Points = vtkSmartPointer<vtkPoints>::New();
while(std::getline(filestream, line)) {
double x, y, z;
int i = 0;
std::stringstream linestream;
linestream << line;
linestream >> x >> y >> z;
m_Points->InsertNextPoint(x, y, z);
}
filestream.close();
vtkSmartPointer<vtkPolyData> PointsPolyData = vtkSmartPointer<vtkPolyData>::New();
PointsPolyData->SetPoints(m_Points);
vtkIdType PointsNumber1 = PointsPolyData->GetNumberOfPoints();
std::cout << "输入TXT构成source几何数据"
"点数:" << PointsNumber1 - 1 << std::endl;
vtkSmartPointer<vtkVertexGlyphFilter> vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
vertexGlyphFilter->SetInputData(PointsPolyData);
vertexGlyphFilter->Update();
source->ShallowCopy(vertexGlyphFilter->GetOutput());
std::string filename2 = "../data/f_10";
std::ifstream filestream2(filename2.c_str());
std::string line2;
vtkSmartPointer<vtkPoints> m_Points2 = vtkSmartPointer<vtkPoints>::New();
while(std::getline(filestream2, line2)) {
double x2, y2, z2;
int i2 = 0;
std::stringstream linestream2;
linestream2 << line2;
linestream2 >> x2 >> y2 >> z2;
m_Points2->InsertNextPoint(x2, y2, z2);
}
filestream2.close();
vtkSmartPointer<vtkPolyData> PointsPolyData2 = vtkSmartPointer<vtkPolyData>::New();
PointsPolyData2->SetPoints(m_Points2);
vtkIdType PointsNumber = PointsPolyData2->GetNumberOfPoints();
std::cout << "输入TXT构成target几何数据点数:" << PointsNumber - 1 << std::endl;
vtkSmartPointer<vtkVertexGlyphFilter> vertexGlyphFilter2 = vtkSmartPointer<vtkVertexGlyphFilter>::New();
vertexGlyphFilter2->SetInputData(PointsPolyData2);
vertexGlyphFilter2->Update();
target->ShallowCopy(vertexGlyphFilter2->GetOutput());
vtkSmartPointer<vtkIterativeClosestPointTransform> icp =
vtkSmartPointer<vtkIterativeClosestPointTransform>::New();
icp->SetSource(source);
icp->SetTarget(target);
icp->GetLandmarkTransform()->SetModeToRigidBody();
icp->SetMaximumNumberOfIterations(20);
icp->Modified();
icp->Update();
vtkSmartPointer<vtkMatrix4x4> m = icp->GetMatrix();
std::cout << "The resulting matrix is: " << *m << std::endl;
vtkSmartPointer<vtkTransformPolyDataFilter> icpTransformFilter =
vtkSmartPointer<vtkTransformPolyDataFilter>::New();
icpTransformFilter->SetInputData(source);
icpTransformFilter->SetTransform(icp);
icpTransformFilter->Update();
vtkSmartPointer<vtkPolyDataMapper> sourceMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
sourceMapper->SetInputData(source);
vtkSmartPointer<vtkActor> sourceActor =
vtkSmartPointer<vtkActor>::New();
sourceActor->SetMapper(sourceMapper);
sourceActor->GetProperty()->SetColor(1, 0, 0);
sourceActor->GetProperty()->SetPointSize(4);
vtkSmartPointer<vtkPolyDataMapper> targetMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
targetMapper->SetInputData(target);
vtkSmartPointer<vtkActor> targetActor =
vtkSmartPointer<vtkActor>::New();
targetActor->SetMapper(targetMapper);
targetActor->GetProperty()->SetColor(0, 1, 0);
targetActor->GetProperty()->SetPointSize(4);
vtkSmartPointer<vtkPolyDataMapper> solutionMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
solutionMapper->SetInputConnection(icpTransformFilter->GetOutputPort());
vtkSmartPointer<vtkActor> solutionActor =
vtkSmartPointer<vtkActor>::New();
solutionActor->SetMapper(solutionMapper);
solutionActor->GetProperty()->SetColor(0, 0, 1);
solutionActor->GetProperty()->SetPointSize(3);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(sourceActor);
renderer->AddActor(targetActor);
renderer->AddActor(solutionActor);
renderer->SetBackground(.4, .5, .7);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}