34 vtkPoints *inputPoints,
35 const std::vector<Generator2> &generators) {
36 const auto cd = vtu->GetCellData();
39 for(
auto const &g : generators)
40 n_triangles += g.first.size();
43 vtkNew<vtkIntArray> triangleId{};
44 triangleId->SetName(
"TriangleIdentifier");
45 triangleId->SetNumberOfTuples(n_triangles);
46 cd->AddArray(triangleId);
48 vtkNew<vtkIntArray> classId{};
49 classId->SetName(
"ClassIdentifier");
50 classId->SetNumberOfTuples(n_triangles);
51 cd->AddArray(classId);
53 vtkNew<vtkDoubleArray> classBirth{};
54 classBirth->SetName(
"ClassBirth");
55 classBirth->SetNumberOfTuples(n_triangles);
56 cd->AddArray(classBirth);
58 vtkNew<vtkDoubleArray> classDeath{};
59 classDeath->SetName(
"ClassDeath");
60 classDeath->SetNumberOfTuples(n_triangles);
61 cd->AddArray(classDeath);
63 vtkNew<vtkDoubleArray> classPersistence{};
64 classPersistence->SetName(
"ClassPersistence");
65 classPersistence->SetNumberOfTuples(n_triangles);
66 cd->AddArray(classPersistence);
68 vtkNew<vtkIntArray> classDimension{};
69 classDimension->SetName(
"ClassDimension");
70 classDimension->SetNumberOfTuples(n_triangles);
71 cd->AddArray(classDimension);
74 vtkNew<vtkIdTypeArray> offsets{}, connectivity{};
75 offsets->SetNumberOfComponents(1);
76 offsets->SetNumberOfTuples(n_triangles + 1);
77 connectivity->SetNumberOfComponents(1);
78 connectivity->SetNumberOfTuples(3 * n_triangles);
81 for(
unsigned j = 0; j < generators.size(); ++j) {
83 for(
auto const &t : g.first) {
84 const unsigned i0 = 3 * i, i1 = 3 * i + 1, i2 = 3 * i + 2;
85 triangleId->SetTuple1(i, i);
86 classId->SetTuple1(i, j);
87 classBirth->SetTuple1(i, g.second.first);
88 classDeath->SetTuple1(i, g.second.second);
89 classPersistence->SetTuple1(i, g.second.second - g.second.first);
90 classDimension->SetTuple1(i, 2);
92 connectivity->SetTuple1(i0, t[0]);
93 connectivity->SetTuple1(i1, t[1]);
94 connectivity->SetTuple1(i2, t[2]);
95 offsets->SetTuple1(i, 3 * i);
100 offsets->SetTuple1(n_triangles, connectivity->GetNumberOfTuples());
102 vtkNew<vtkCellArray> cells{};
103 cells->SetData(offsets, connectivity);
104 vtu->SetPoints(inputPoints);
105 vtu->SetCells(VTK_TRIANGLE, cells);
134 vtkInformationVector **inputVector,
135 vtkInformationVector *outputVector) {
139 vtkInformation *info = inputVector[0]->GetInformationObject(0);
140 vtkDataObject *input = info->Get(vtkDataObject::DATA_OBJECT());
141 vtkUnstructuredGrid *outputPersistenceDiagram
142 = vtkUnstructuredGrid::GetData(outputVector, 0);
143 vtkUnstructuredGrid *outputGenerators1
144 = vtkUnstructuredGrid::GetData(outputVector, 1);
145 vtkUnstructuredGrid *outputGenerators2
146 = vtkUnstructuredGrid::GetData(outputVector, 2);
152 int numberOfPoints = 0;
155 if(vtkTable *table = vtkTable::SafeDownCast(input)) {
156 if(SelectFieldsWithRegexp) {
158 ScalarFields.clear();
159 const auto n = table->GetNumberOfColumns();
160 for(
int i = 0; i < n; ++i) {
161 const auto &name = table->GetColumnName(i);
162 if(std::regex_match(name, std::regex(RegexpString))) {
163 ScalarFields.emplace_back(name);
168 if(table->GetNumberOfRows() <= 0 || ScalarFields.size() <= 1) {
169 this->
printErr(
"Input matrix has invalid dimensions (rows: "
170 + std::to_string(table->GetNumberOfRows()) +
", columns: "
171 + std::to_string(ScalarFields.size()) +
")");
175 std::vector<vtkAbstractArray *> arrays;
176 arrays.reserve(ScalarFields.size());
177 for(
const auto &s : ScalarFields)
178 arrays.push_back(table->GetColumnByName(s.data()));
180 numberOfPoints = table->GetNumberOfRows();
181 dimension = ScalarFields.size();
183 points.resize(numberOfPoints);
184 for(
int i = 0; i < numberOfPoints; ++i) {
185 for(
int j = 0; j < dimension; ++j)
186 points[i].push_back(arrays[j]->GetVariantValue(i).ToDouble());
190 else if(vtkPointSet *pointset = vtkPointSet::SafeDownCast(input)) {
191 numberOfPoints = pointset->GetNumberOfPoints();
193 points.resize(numberOfPoints, std::vector<double>(3));
194 for(
int i = 0; i < numberOfPoints; ++i)
195 pointset->GetPoint(i, points[i].data());
198 this->
printMsg(
"Computing Delaunay-Rips persistence diagram", 1.0,
200 this->
printMsg(
"#dimensions: " + std::to_string(dimension)
201 +
", #points: " + std::to_string(numberOfPoints),
205 std::vector<Generator1> generators1;
206 std::vector<Generator2> generators2;
208 if(this->
execute(points, diagram, generators1, generators2) != 0)
212 const vtkNew<vtkPoints> vtkPoints{};
213 MakeVtkPoints(vtkPoints, points);
220 outputPersistenceDiagram->GetFieldData()->ShallowCopy(input->GetFieldData());
221 outputGenerators1->GetFieldData()->ShallowCopy(input->GetFieldData());
222 outputGenerators2->GetFieldData()->ShallowCopy(input->GetFieldData());
int DiagramToVTU(vtkUnstructuredGrid *vtu, const ttk::DiagramType &diagram, vtkDataArray *const inputScalars, const ttk::Debug &dbg, const int dim, const bool embedInDomain)
Converts a Persistence Diagram in the ttk::DiagramType format to the VTK Unstructured Grid format (as...