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()
容量)然后添加 edge
和 push_back()
... 或者,更好的是,构造它 in-place 与 emplace_back()
.
我尝试了一段时间来定义 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()
容量)然后添加 edge
和 push_back()
... 或者,更好的是,构造它 in-place 与 emplace_back()
.