4 #include <vtkPolyData.h>
8 #include <vtkCellArray.h>
9 #include "vtkCardinalSpline.h"
37 int N = centerline_r->GetNumberOfPoints();
38 Eigen::MatrixXd CLpoints(3,N);
39 for(vtkIdType i = 0; i < N; i++)
42 centerline_r->GetPoint(i,p);
43 Eigen::Vector3d position;
44 position(0) = p[0]; position(1) = p[1]; position(2) = p[2];
45 CLpoints.block(0 , i , 3 , 1) = position;
53 mBranchListPtr->deleteAllBranches();
57 mBranchListPtr->findBranchesInCenterline(CLpoints_r);
59 mBranchListPtr->calculateOrientations();
60 mBranchListPtr->smoothOrientations();
62 std::cout <<
"Number of branches in CT centerline: " << mBranchListPtr->getBranches().size() << std::endl;
69 double minDistance = 100000;
70 int minDistancePositionIndex;
72 std::vector<BranchPtr> branches = mBranchListPtr->getBranches();
73 for (
int i = 0; i < branches.size(); i++)
75 Eigen::MatrixXd positions = branches[i]->getPositions();
76 for (
int j = 0; j < positions.cols(); j++)
78 double D =
findDistance(positions.col(j), targetCoordinate_r);
82 minDistanceBranch = branches[i];
83 minDistancePositionIndex = j;
88 mProjectedBranchPtr = minDistanceBranch;
89 mProjectedIndex = minDistancePositionIndex;
95 mRoutePositions.clear();
102 Eigen::MatrixXd positions = searchBranchPtr->getPositions();
104 for (
int i = startIndex; i>=0; i--)
105 mRoutePositions.push_back(positions.col(i));
107 BranchPtr parentBranchPtr = searchBranchPtr->getParentBranch();
109 searchBranchUp(parentBranchPtr, parentBranchPtr->getPositions().cols()-1);
128 float extentionPointIncrement = 0.5;
129 mExtendedRoutePositions.clear();
130 mExtendedRoutePositions = mRoutePositions;
131 double extentionDistance =
findDistance(mRoutePositions.front(),targetCoordinate_r);
132 Eigen::Vector3d extentionVector = ( targetCoordinate_r - mRoutePositions.front() ) / extentionDistance;
133 int numberOfextentionPoints = (int) extentionDistance * extentionPointIncrement;
134 Eigen::Vector3d extentionPointIncrementVector = extentionVector / extentionPointIncrement;
136 for (
int i = 1; i<= numberOfextentionPoints; i++)
138 mExtendedRoutePositions.insert(mExtendedRoutePositions.begin(), mRoutePositions.front() + extentionPointIncrementVector*i);
139 std::cout << mRoutePositions.front() + extentionPointIncrementVector*i << std::endl;
152 int numberOfPositions = positions.size();
153 for (
int j = numberOfPositions - 1; j >= 0; j--)
155 points->InsertNextPoint(positions[j](0),positions[j](1),positions[j](2));
157 for (
int j = 0; j < numberOfPositions-1; j++)
159 vtkIdType connection[2] = {j, j+1};
160 lines->InsertNextCell(2, connection);
162 retval->SetPoints(points);
163 retval->SetLines(lines);
167 void RouteToTarget::smoothPositions()
169 int numberOfInputPoints = mRoutePositions.size();
170 int controlPointFactor = 10;
171 int numberOfControlPoints = numberOfInputPoints / controlPointFactor;
177 if (numberOfControlPoints >= 2)
180 for(
int j=0; j<numberOfControlPoints; j++)
182 int indexP = (j*numberOfInputPoints)/numberOfControlPoints;
183 splineX->AddPoint(indexP,mRoutePositions[indexP](0));
184 splineY->AddPoint(indexP,mRoutePositions[indexP](1));
185 splineZ->AddPoint(indexP,mRoutePositions[indexP](2));
188 splineX->AddPoint(numberOfInputPoints-1,mRoutePositions[numberOfInputPoints-1](0));
189 splineY->AddPoint(numberOfInputPoints-1,mRoutePositions[numberOfInputPoints-1](1));
190 splineZ->AddPoint(numberOfInputPoints-1,mRoutePositions[numberOfInputPoints-1](2));
194 std::vector< Eigen::Vector3d > smoothingResult;
195 for(
int j=0; j<numberOfInputPoints; j++)
197 double splineParameter = j;
198 Eigen::Vector3d tempPoint;
199 tempPoint(0) = splineX->Evaluate(splineParameter);
200 tempPoint(1) = splineY->Evaluate(splineParameter);
201 tempPoint(2) = splineZ->Evaluate(splineParameter);
202 smoothingResult.push_back(tempPoint);
204 mRoutePositions.clear();
205 mRoutePositions = smoothingResult;
212 double d0 = p1(0) - p2(0);
213 double d1 = p1(1) - p2(1);
214 double d2 = p1(2) - p2(2);
216 double D = sqrt( d0*d0 + d1*d1 + d2*d2 );
vtkPolyDataPtr findExtendedRoute(Vector3D targetCoordinate_r)
vtkSmartPointer< class vtkCellArray > vtkCellArrayPtr
vtkPolyDataPtr addVTKPoints(std::vector< Eigen::Vector3d > positions)
boost::shared_ptr< class Branch > BranchPtr
double findDistance(Eigen::MatrixXd p1, Eigen::MatrixXd p2)
vtkSmartPointer< class vtkCardinalSpline > vtkCardinalSplinePtr
vtkSmartPointer< class vtkPolyData > vtkPolyDataPtr
void findClosestPointInBranches(Vector3D targetCoordinate_r)
void searchBranchUp(BranchPtr searchBranchPtr, int startIndex)
void processCenterline(vtkPolyDataPtr centerline_r)
vtkSmartPointer< class vtkCardinalSpline > vtkCardinalSplinePtr
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
vtkPolyDataPtr findRouteToTarget(Vector3D targetCoordinate_r)
void findRoutePositions()
vtkSmartPointer< class vtkPoints > vtkPointsPtr
Eigen::MatrixXd getCenterlinePositions(vtkPolyDataPtr centerline_r)