在使用 GNU Triangulated Surface Library 进行约束 Delaunay 三角剖分时,我遇到了一些间歇性断言失败。我在不同的时间看到了以下每一个:
Gts:ERROR:cdt.c:974:remove_intersected_vertex: 代码不应该到达 Gts:ERROR:cdt.c:896:remove_intersected_edge: 断言失败: (下一个) Gts:ERROR:cdt.c:887:remove_intersected_edge: 断言失败: (o2 == 0。)
我查看了 cdt.c,但我所能弄清楚的是它们来自对 gts_delaunay_add_constraint 的调用。
有人可以解释约束可能有什么问题,这会导致这些断言失败吗?
当我尝试对一组随机顶点进行三角剖分时,会发生断言失败。不幸的是,它只发生在大量顶点和约束的情况下,因此很难找出失败输入的模式。使用 GTS 的代码即使输入错误也不会崩溃,因此最好防止这些断言失败,否则我将不得不禁用断言。
编辑:尝试删除所有相交约束(存储在edges
):
int numPossEdges = gts_fifo_size(edges);
GtsEdge **possEdges = malloc(numPossEdges * sizeof(GtsEdge *));
for (int i = 0; i < numPossEdges; ++i)
possEdges[i] = gts_fifo_pop(edges);
for (int i = 0; i < numPossEdges; ++i)
for (int j = 0; j < i && possEdges[i] != NULL; ++j)
if (possEdges[j] != NULL && GTS_IN == gts_segments_are_intersecting(&(possEdges[i]->segment), &(possEdges[j]->segment)))
possEdges[i] = NULL;
for (int i = 0; i < numPossEdges; ++i)
if (possEdges[i] != NULL)
gts_fifo_push(edges, possEdges[i]);
仍然得到相同的断言失败。