17 #include <vtkDataArray.h> 18 #include <vtkDelaunay3D.h> 19 #include <vtkDoubleArray.h> 20 #include <vtkPointData.h> 21 #include <vtkPointLocator.h> 22 #include <vtkPoints.h> 23 #include <vtkPolyVertex.h> 24 #include <vtkSmartPointer.h> 25 #include <vtkUnstructuredGrid.h> 26 #include <vtkVariant.h> 29 : m_eps(5.0), m_MinPts(4), m_Meshing(false), m_DistCalc(false)
54 if (inputGrid.IsNull())
57 vtkSmartPointer<vtkUnstructuredGrid> vtkInpGrid = inputGrid->GetVtkUnstructuredGrid();
58 vtkSmartPointer<vtkPoints> inpPoints = vtkInpGrid->GetPoints();
59 pLocator = vtkSmartPointer<vtkPointLocator>::New();
61 vtkSmartPointer<vtkDoubleArray> distances = vtkSmartPointer<vtkDoubleArray>::New();
62 if (inputGrid->GetVtkUnstructuredGrid()->GetPointData()->GetNumberOfArrays() > 0)
65 distances =
dynamic_cast<vtkDoubleArray *
>(vtkInpGrid->GetPointData()->GetArray(0));
70 pLocator->SetNumberOfPointsPerBucket(2);
74 for (
int i = 0; i < inpPoints->GetNumberOfPoints(); i++)
78 clusterMember[i] =
false;
81 for (
int i = 0; i < inpPoints->GetNumberOfPoints(); i++)
86 vtkSmartPointer<vtkIdList> idList = vtkSmartPointer<vtkIdList>::New();
87 pLocator->FindPointsWithinRadius(m_eps, inpPoints->GetPoint(i), idList);
88 if (idList->GetNumberOfIds() < m_MinPts)
94 vtkSmartPointer<vtkPoints> cluster = vtkSmartPointer<vtkPoints>::New();
95 clusterVector.push_back(cluster);
97 i, idList, cluster, inpPoints);
104 int numberOfClusterPoints = 0;
105 int IdOfBiggestCluster = 0;
107 for (
unsigned int i = 0; i < m_Clusters.size(); i++)
109 vtkSmartPointer<vtkDoubleArray> array = vtkSmartPointer<vtkDoubleArray>::New();
110 vtkSmartPointer<vtkPoints> points = m_Clusters.at(i);
113 array->SetNumberOfComponents(1);
114 array->SetNumberOfTuples(points->GetNumberOfPoints());
115 for (
int j = 0; j < points->GetNumberOfPoints(); j++)
118 points->GetPoint(j, point);
119 if (clustersPointsIDs.at(i).at(j) < inpPoints->GetNumberOfPoints())
121 if (distances->GetValue(clustersPointsIDs.at(i).at(j)) > 0.001)
123 double dist[1] = {distances->GetValue(clustersPointsIDs.at(i).at(j))};
124 array->SetTuple(j, dist);
128 double dist[1] = {0.0};
129 array->SetTuple(j, dist);
133 m_DistanceArrays.push_back(array);
135 if (points->GetNumberOfPoints() > numberOfClusterPoints)
137 numberOfClusterPoints = points->GetNumberOfPoints();
138 IdOfBiggestCluster = i;
142 vtkSmartPointer<vtkUnstructuredGrid> biggestCluster = vtkSmartPointer<vtkUnstructuredGrid>::New();
144 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
145 points = m_Clusters.at(IdOfBiggestCluster);
147 vtkSmartPointer<vtkPolyVertex> verts = vtkSmartPointer<vtkPolyVertex>::New();
148 verts->GetPointIds()->SetNumberOfIds(m_Clusters.at(IdOfBiggestCluster)->GetNumberOfPoints());
149 for (
int i = 0; i < m_Clusters.at(IdOfBiggestCluster)->GetNumberOfPoints(); i++)
151 verts->GetPointIds()->SetId(i, i);
154 biggestCluster->Allocate(1);
155 biggestCluster->InsertNextCell(verts->GetCellType(), verts->GetPointIds());
156 biggestCluster->SetPoints(m_Clusters.at(IdOfBiggestCluster));
160 vtkSmartPointer<vtkDelaunay3D> mesher = vtkSmartPointer<vtkDelaunay3D>::New();
161 mesher->SetInputData(biggestCluster);
162 mesher->SetAlpha(0.9);
165 vtkSmartPointer<vtkUnstructuredGrid> output = mesher->GetOutput();
166 m_UnstructGrid->SetVtkUnstructuredGrid(output);
170 m_UnstructGrid->SetVtkUnstructuredGrid(biggestCluster);
173 clusterVector.clear();
174 clustersPointsIDs.clear();
177 void mitk::UnstructuredGridClusteringFilter::ExpandCluster(
int id,
180 vtkPoints *inpPoints)
184 cluster->InsertNextPoint(inpPoints->GetPoint(
id));
185 clusterMember[id] =
true;
187 vtkSmartPointer<vtkPoints> neighbours = vtkSmartPointer<vtkPoints>::New();
188 inpPoints->GetPoints(pointIDs, neighbours);
190 for (
int i = 0; i < pointIDs->GetNumberOfIds(); i++)
192 if (!visited[pointIDs->GetId(i)])
194 visited[pointIDs->GetId(i)] =
true;
195 vtkSmartPointer<vtkIdList> idList = vtkSmartPointer<vtkIdList>::New();
197 m_eps, inpPoints->GetPoint(pointIDs->GetId(i)), idList);
199 if (idList->GetNumberOfIds() >= m_MinPts)
201 for (
int j = 0; j < idList->GetNumberOfIds(); j++)
203 if (idList->GetId(j) < inpPoints->GetNumberOfPoints())
205 pointIDs->InsertNextId(idList->GetId(j));
210 if (!clusterMember[pointIDs->GetId(i)])
212 if (pointIDs->GetId(i) < inpPoints->GetNumberOfPoints())
214 clusterMember[pointIDs->GetId(i)] =
true;
215 x.push_back(pointIDs->GetId(i));
216 cluster->InsertNextPoint(inpPoints->GetPoint(pointIDs->GetId(i)));
221 clustersPointsIDs.push_back(x);
226 std::vector<mitk::UnstructuredGrid::Pointer> mitkUGridVector;
228 for (
unsigned int i = 0; i < m_Clusters.size(); i++)
230 vtkSmartPointer<vtkUnstructuredGrid> cluster = vtkSmartPointer<vtkUnstructuredGrid>::New();
232 vtkSmartPointer<vtkPoints> points = m_Clusters.at(i);
234 vtkSmartPointer<vtkPolyVertex> verts = vtkSmartPointer<vtkPolyVertex>::New();
236 verts->GetPointIds()->SetNumberOfIds(points->GetNumberOfPoints());
237 for (
int j = 0; j < points->GetNumberOfPoints(); j++)
239 verts->GetPointIds()->SetId(j, j);
242 cluster->Allocate(1);
243 cluster->InsertNextCell(verts->GetCellType(), verts->GetPointIds());
244 cluster->SetPoints(points);
247 cluster->GetPointData()->AddArray(m_DistanceArrays.at(i));
254 vtkSmartPointer<vtkDelaunay3D> mesher = vtkSmartPointer<vtkDelaunay3D>::New();
255 mesher->SetInputData(cluster);
256 mesher->SetAlpha(0.9);
259 vtkSmartPointer<vtkUnstructuredGrid> output = mesher->GetOutput();
260 mitkGrid->SetVtkUnstructuredGrid(output);
264 mitkGrid->SetVtkUnstructuredGrid(cluster);
267 mitkUGridVector.push_back(mitkGrid);
270 return mitkUGridVector;
275 return m_Clusters.size();
std::vector< std::vector< int > > clustersPointsIDs
void GenerateOutputInformation() override
~UnstructuredGridClusteringFilter() override
std::map< int, bool > isNoise
std::map< int, bool > visited
UnstructuredGridClusteringFilter()
void GenerateData() override
const mitk::UnstructuredGrid * GetInput(void)
std::vector< vtkSmartPointer< vtkPoints > > clusterVector
virtual std::vector< mitk::UnstructuredGrid::Pointer > GetAllClusters()
virtual int GetNumberOfFoundClusters()
std::map< int, bool > clusterMember
vtkSmartPointer< vtkPointLocator > pLocator
Class for storing unstructured grids (vtkUnstructuredGrid)