bool RootList::addRoot(Node node, const char16_t *edgeName) { MOZ_ASSERT(noGC.isSome()); MOZ_ASSERT_IF(wantNames, edgeName); mozilla::UniquePtr<char16_t[], JS::FreePolicy> name; if (edgeName) { name = DuplicateString(cx, edgeName); if (!name) return false; } return edges.append(mozilla::Move(SimpleEdge(name.release(), node))); }
void MeshManager::updateReebGraph(const vector<double> &fvals) { vtkSmartPointer<vtkReebGraph> surfaceReebGraph = vtkSmartPointer<vtkReebGraph>::New(); int nverts = vtkMesh->GetNumberOfPoints(); cout << "number of points = " << vtkMesh->GetNumberOfPoints() << endl; cout << "[VTK] Preparing scalar data ..." << endl; vtkSmartPointer<vtkDoubleArray> scalarField = vtkSmartPointer<vtkDoubleArray>::New(); scalarField->Resize(nverts); if (fvals.empty() || fvals.size() != nverts) { for (int i = 0; i < nverts; ++i) { auto pt = vtkMesh->GetPoint(i); scalarField->SetValue(i, pt[2]); } } else { for (int i = 0; i < nverts; ++i) { scalarField->SetValue(i, fvals[i]); } } cout << "[VTK] Building reeb graph ..." << endl; int ret = surfaceReebGraph->Build(vtkMesh, scalarField); switch (ret) { case vtkReebGraph::ERR_INCORRECT_FIELD: cout << "[VTK] ERR_INCORRECT_FIELD" << endl; break; case vtkReebGraph::ERR_NOT_A_SIMPLICIAL_MESH: cout << "[VTK] ERR NOT A SIMPLICIAL MESH" << endl; break; default: cout << "[VTK] Succeeded." << endl; break; } surfaceReebGraph->Print(std::cout); rbGraph.clear(); // print the information of this graph vtkSmartPointer<vtkVertexListIterator> it = vtkVertexListIterator::New(); surfaceReebGraph->GetVertices(it); while (it->HasNext()) { auto vidx = it->Next(); auto vdata = surfaceReebGraph->GetVertexData(); auto refidx = vdata->GetArray("Vertex Ids")->GetComponent(vidx, 0); cout << refidx << endl; rbGraph.V.push_back(SimpleNode(vidx, refidx)); auto ptdata = vtkMesh->GetPoint(refidx); cout << ptdata[0] << ", " << ptdata[1] << ", " << ptdata[2] << endl; } vtkSmartPointer<vtkEdgeListIterator> eit = vtkEdgeListIterator::New(); surfaceReebGraph->GetEdges(eit); while (eit->HasNext()) { auto edge = eit->NextGraphEdge(); rbGraph.E.push_back(SimpleEdge(edge->GetSource(), edge->GetTarget())); cout << edge->GetSource() << " -> " << edge->GetTarget() << endl; } vtkDataArray *vertexInfo = vtkDataArray::SafeDownCast(surfaceReebGraph->GetVertexData()->GetAbstractArray("Vertex Ids")); vtkVariantArray *edgeInfo = vtkVariantArray::SafeDownCast(surfaceReebGraph->GetEdgeData()->GetAbstractArray("Vertex Ids")); surfaceReebGraph->GetEdges(eit); while (eit->HasNext()) { vtkEdgeType e = eit->Next(); vtkAbstractArray *deg2NodeList = edgeInfo->GetPointer(e.Id)->ToArray(); cout << " Arc #" << e.Id << ": " //<< *(vertexInfo->GetTuple(e.Source)) << vertexInfo->GetComponent(e.Source, 0) << " -> " //<< *(vertexInfo->GetTuple(e.Target)) << vertexInfo->GetComponent(e.Target, 0) << " (" << deg2NodeList->GetNumberOfTuples() << " degree-2 nodes)" << endl; int ntuples = deg2NodeList->GetNumberOfTuples(); if (ntuples > 0) { rbGraph.Es.push_back(SimpleEdge(vertexInfo->GetComponent(e.Source, 0), deg2NodeList->GetVariantValue(0).ToInt())); for (int j = 0; j < ntuples - 1; ++j) { rbGraph.Es.push_back(SimpleEdge(deg2NodeList->GetVariantValue(j).ToInt(), deg2NodeList->GetVariantValue(j + 1).ToInt())); } rbGraph.Es.push_back(SimpleEdge(deg2NodeList->GetVariantValue(ntuples - 1).ToInt(), vertexInfo->GetComponent(e.Target, 0))); } else { rbGraph.Es.push_back(SimpleEdge(vertexInfo->GetComponent(e.Source, 0), vertexInfo->GetComponent(e.Target, 0))); } } }