CDT C++ 库:如何定义边?

CDT C++ library: How to define an edge?

我尝试了一段时间来定义 CDT 中的一条边。下面是我的代码。第一个函数工作正常,但第二个函数的编译抛出此错误:没有匹配函数调用 CDT::Edge::Edge()。我还尝试了许多其他试验,但没有成功。

typedef CDT::V2d<double> Vertex;
typedef CDT::Edge Edge;
typedef CDT::Triangulation<double> Triangulation;

arma::umat Rcpp_delaunay(const arma::mat & points){
  Triangulation cdt(CDT::VertexInsertionOrder::AsProvided);
  size_t npoints = points.n_rows;
  std::vector<Vertex> vertices(npoints);
  for (size_t i = 0; i < npoints; ++i) {
    const arma::rowvec row_i = points.row(i);
    vertices[i] = Vertex::make(row_i(0), row_i(1));
  }
  cdt.insertVertices(vertices);
  cdt.eraseSuperTriangle();
  const CDT::TriangleVec triangles = cdt.triangles;
  arma::umat out(triangles.size(), 3);
  for(size_t i = 0; i < triangles.size(); ++i){
    const CDT::VerticesArr3 trgl = triangles[i].vertices;
    out(i, 0) = trgl[0];
    out(i, 1) = trgl[1];
    out(i, 2) = trgl[2];
  }
  return out;
}

arma::umat Rcpp_constrained_delaunay(
    const arma::mat & points, const arma::umat & edges
){
  Triangulation cdt(CDT::VertexInsertionOrder::AsProvided);
  size_t npoints = points.n_rows;
  std::vector<Vertex> vertices(npoints);
  for (size_t i = 0; i < npoints; ++i) {
    const arma::rowvec row_i = points.row(i);
    vertices[i] = Vertex::make(row_i(0), row_i(1));
  }
  size_t nedges = edges.n_rows;
  std::vector<Edge> Edges(nedges);
  for (size_t i = 0; i < nedges; ++i) {
    const arma::urowvec row_i = edges.row(i);
    Edge edge = Edge(row_i(0), row_i(1));
    Edges[i] = edge;
  }
  cdt.insertVertices(vertices);
  cdt.insertEdges(Edges);
  cdt.eraseOuterTrianglesAndHoles();
  const CDT::TriangleVec triangles = cdt.triangles;
  arma::umat out(triangles.size(), 3);
  for(size_t i = 0; i < triangles.size(); ++i){
    const CDT::VerticesArr3 trgl = triangles[i].vertices;
    out(i, 0) = trgl[0];
    out(i, 1) = trgl[1];
    out(i, 2) = trgl[2];
  }
  return out;
}

Edge 没有默认构造函数,所以你不能给 vector<Edge> 一个初始大小(因为这需要每个元素初始为 default-constructed)。相反,首先让向量为空(如果你愿意,你可以 reserve() 容量)然后添加 edgepush_back() ... 或者,更好的是,构造它 in-place 与 emplace_back().