用GTS约束Delaunay三角剖分中的断言失败

时间:2011-06-17 15:08:56

标签: c triangulation

在使用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]);

仍然得到相同的断言失败。

2 个答案:

答案 0 :(得分:1)

如果你是完全随机创建顶点和约束,我想你可能会提供相互交叉的约束边。在这种情况下,我当然希望三角测量程序能够抱怨。

答案 1 :(得分:1)

  

即使输入错误,使用GTS的代码也不会崩溃,所以它   会很好地防止这些断言失败,否则我会有   禁用断言。

我最终写了一个补丁,导致GTS(基本上)抛出异常,而不是在遇到断言失败时停止。补丁是here