示例#1
0
文件: UbiNode.cpp 项目: mmatyas/mozjs
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)));
}
示例#2
0
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)));
    }
  }
}