在使用GNU三角化曲面库进行约束Delaunay三角化时,我得到了一些断断续续的断言失败。我在不同的时间见过以下每一种情况:
Gts:错误:cdt.c:974:删除相交顶点:不应到达代码
Gts:错误:cdt.c:896:删除相交的边缘:断言失败:(下一步)
Gts:错误:cdt.c:887:删除相交的边缘:断言失败:(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]);
仍然得到相同的断言失败。
最佳答案
如果您完全随机地创建顶点和约束,我想您可能会提供相互相交的约束边。在这种情况下,我当然希望三角测量程序会抱怨。