在使用GNU Triangulated Surface Library进行约束Delaunay三角化时,我得到了一些断断续续的断言失败。我在不同时间见过以下各项:
Gts:ERROR:cdt.c:974:remove_intersected_vertex:不应该访问代码 Gts:错误:cdt.c:896:remove_intersected_edge:断言失败:(下) Gts:错误: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]);
仍然得到相同的断言失败。
答案 0 :(得分:1)
如果你是完全随机创建顶点和约束,我想你可能会提供相互交叉的约束边。在这种情况下,我当然希望三角测量程序能够抱怨。
答案 1 :(得分:1)
即使输入错误,使用GTS的代码也不会崩溃,所以它 会很好地防止这些断言失败,否则我会有 禁用断言。
我最终写了一个补丁,导致GTS(基本上)抛出异常,而不是在遇到断言失败时停止。补丁是here。