在CGAL下,对于受约束的三角测量,网格单元的顺序是否会因运行而异?



我迭代finie_vertiecesfinite_edgesfinite_faces后,使用Loyd优化生成约束的delauny三角测量。我在发布模式下使用 CGAL 4.12 的 VS2012。我看到对于给定的情况finite_verices列表是可重复的(finite_faces下的顶点列表也是如此(,但是,finite_edges中边缘的顺序似乎因运行而异

for(auto eit = cdtp.finite_edges_begin(); eit != cdtp.finite_edges_end(); ++eit)
{
const auto isConstrainedEdge  = cdtp.is_constrained(*eit);
auto & cFace = *(eit->first);
auto cwVert = cFace.vertex(cFace.cw(eit->second));
auto ccwVert = cFace.vertex(cFace.ccw(eit->second));

我使用上面的代码片段来提取顶点列表,并且具有给定边缘的顶点列表在每次运行之间都会发生变化。 感谢任何帮助解决这个问题,因为我正在寻找代码中的一致行为。我的三角测量涉及二维域上的许多线约束。

有人告诉我这可能是可靠的行为,但不能保证秩序。IIRC的文件说,遍历顺序不能保证。我认为最好假设迭代器的横向不是确定性的,可能会发生变化。

您可以使用任何_info扩展将信息嵌入到面部,边缘等(也许是哈希值?(,然后您可以检查这些信息以检测更改。

在我的用例中,我想并行遍历网格,但 OpenMP 不支持迭代器。所以我在内存中保存了一个Face_handles向量,然后我可以轻松地对其进行索引。结合_info数据,您可以使用->info()字段中的唯一信息,以保证顺序构建边缘、面等的向量。

另一个_info的例子。

最新更新