diff --git a/main.cpp b/main.cpp index 3ff169378ccba9705bea2252bd2b23723a2b0776..c3642901775abbba4fb38b0f0a662a1113c21932 100644 --- a/main.cpp +++ b/main.cpp @@ -192,81 +192,56 @@ int main(int argc, char *argv[]) */ /** Another filter **/ - double threshold = 0.9; + double threshold = 0.95; - vtkSmartPointer<vtkPoints> filteredPoints = vtkSmartPointer<vtkPoints>::New(); - vtkSmartPointer<vtkDoubleArray> filteredShapeIndex = vtkSmartPointer<vtkDoubleArray>::New(); - filteredShapeIndex->SetName("Filtered_Shape_Index"); - - for (vtkIdType i = 0; i < k2->GetNumberOfPoints(); ++i) - { - double kmax = k1Array->GetVariantValue(i).ToDouble(); - double kmin = k2Array->GetVariantValue(i).ToDouble(); - double si = 0.5 - (1 / M_PI) * atan((kmax + kmin) / (kmin - kmax)); // Calcul de l'indice de forme - - if (si > 0 && si < 1) // Vérifiez si l'indice de forme est différent de 0 et 1 - { - if (si >= threshold) // Vérifiez si l'indice de forme dépasse le seuil - { - filteredPoints->InsertNextPoint(source->GetPoint(i)); - filteredShapeIndex->InsertNextValue(si); - } - } - } - - // Créez un nouveau maillage à partir des points filtrés - vtkSmartPointer<vtkPolyData> filteredMesh = vtkSmartPointer<vtkPolyData>::New(); - filteredMesh->SetPoints(filteredPoints); - filteredMesh->GetPointData()->AddArray(filteredShapeIndex); - - for (vtkIdType i = 0; i < filteredShapeIndex->GetNumberOfTuples(); ++i) - { - double value = filteredShapeIndex->GetValue(i); - std::cout << "Shape_Index[" << i << "] = " << value << std::endl; - } - - source->GetPointData()->AddArray(filteredShapeIndex); - source->GetPointData()->SetActiveScalars("Shape_Index"); + // Create a vtkThresholdPoints filter for each threshold value + vtkNew<vtkThresholdPoints> threshold1; + threshold1->SetInputData(source); + threshold1->SetInputArrayComponent(1); + threshold1->ThresholdBetween(threshold, 1); + threshold1->Update(); + // Create a vtkFTRGraph + vtkNew<ttkFTRGraph> graph1; + graph1->SetInputData(threshold1->GetOutput()); + graph1->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "Shape_Index"); + graph1->Update(); - // vtkNew<ttkFTRGraph> graph; - // graph->SetInputData(filteredMesh); - // graph->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "Shape_Index"); - // graph->Update(); + // Merge the thresholded datasets together into a single polydata + vtkNew<vtkAppendPolyData> appendFilter; + appendFilter->AddInputData(threshold1->GetOutput()); + appendFilter->Update(); // Compute the Reeb Graph of the input dataset vtkNew<ttkFTRGraph> reebGraph; - // reebGraph->SetInputData(source); - // reebGraph->SetInputData(appendFilter->GetOutput()); // ttkFTRGraph for the merged polydata - // reebGraph->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "Shape_Index"); - reebGraph->SetInputData(source); + reebGraph->SetInputData(appendFilter->GetOutput()); reebGraph->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "Shape_Index"); reebGraph->Update(); // Create Icospheres to represent nodes in the Reeb Graph vtkNew<ttkIcospheresFromPoints> ttkIcospheresFromPoints{}; ttkIcospheresFromPoints->SetInputData(0, reebGraph->GetOutput()); - ttkIcospheresFromPoints->SetRadius(0.008); + ttkIcospheresFromPoints->SetRadius(1); ttkIcospheresFromPoints->SetNumberOfSubdivisions(1); ttkIcospheresFromPoints->Update(); - // // Filters dependencies with Tubes : applies smooth to the geometry of the Reeb Graph - // vtkNew<ttkGeometrySmoother> ttkGeometrySmoother{}; - // ttkGeometrySmoother->SetInputConnection(reebGraph->GetOutputPort(1)); - // ttkGeometrySmoother->Update(); + // Filters dependencies with Tubes : applies smooth to the geometry of the Reeb Graph + vtkNew<ttkGeometrySmoother> ttkGeometrySmoother{}; + ttkGeometrySmoother->SetInputConnection(reebGraph->GetOutputPort(1)); + ttkGeometrySmoother->Update(); - // vtkNew<vtkGeometryFilter> geometryFilter{}; - // geometryFilter->SetInputConnection(ttkGeometrySmoother->GetOutputPort()); - // geometryFilter->Update(); + vtkNew<vtkGeometryFilter> geometryFilter{}; + geometryFilter->SetInputConnection(ttkGeometrySmoother->GetOutputPort()); + geometryFilter->Update(); - // vtkNew<vtkPolyData> polyData{}; - // polyData->ShallowCopy(geometryFilter->GetOutput()); + vtkNew<vtkPolyData> polyData{}; + polyData->ShallowCopy(geometryFilter->GetOutput()); - // // Create Tubes to represent edges in the Reeb Graph - // vtkNew<vtkTubeFilter> tube{}; - // tube->SetInputData(polyData); // smoothed geometry of the Reeb graph - // tube->SetRadius(0.004); - // // tube->SetNumberOfSides(1); - // tube->Update(); + // Create Tubes to represent edges in the Reeb Graph + vtkNew<vtkTubeFilter> tube{}; + tube->SetInputData(polyData); // smoothed geometry of the Reeb graph + tube->SetRadius(0.004); + // tube->SetNumberOfSides(1); + tube->Update(); // Save the graph nodes with IcospheresFromPoints vtkNew<vtkXMLPolyDataWriter> writerNodes{}; @@ -286,24 +261,5 @@ int main(int argc, char *argv[]) segWriter->SetInputConnection(reebGraph->GetOutputPort(2)); segWriter->Write(); - /* - // Save the graph nodes (simple graph) - vtkNew<vtkXMLUnstructuredGridWriter> sWriter{}; - sWriter->SetInputConnection(reebGraph->GetOutputPort(0)); - sWriter->SetFileName("outputNodes.vtp"); - sWriter->Write(); - - // Save the graph edges - vtkNew<vtkXMLUnstructuredGridWriter> sepWriter{}; - sepWriter->SetInputConnection(reebGraph->GetOutputPort(1)); - sepWriter->SetFileName("outputEdges.vtp"); - sepWriter->Write(); - - // Save the graph coloration - vtkNew<vtkXMLPolyDataWriter> segWriter{}; - segWriter->SetInputConnection(reebGraph->GetOutputPort(2)); - segWriter->SetFileName("outputColor.vtp"); - segWriter->Write();*/ - return EXIT_SUCCESS; } \ No newline at end of file