c-GTS约束Delaunay三角测量中的断言失败



在使用GNU三角曲面库进行约束Delaunay三角化时,我遇到了一些间歇性的断言失败。我在不同的时间看到了以下每一个:

Gts:错误:cdt.c:974:remove_intersected_evertex:不应到达代码Gts:错误:cdt.c:896:remove_intersected_edge:断言失败:(下一步)Gts:错误:cdt.c:887:remove_intersected_edge:断言失败:(o2==0。)

我看过cdt.c,但我所能弄清楚的是,它们来自对gts_delaunay_add_contraint的调用。

有人能解释一下约束可能存在什么问题,会导致这些断言失败吗?

当我试图对一组随机顶点进行三角测量时,断言失败就会发生。不幸的是,这种情况只发生在大量顶点和约束的情况下,因此很难找出失败输入的模式。使用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]);

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

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

使用GTS的代码即使输入错误也不需要崩溃,因此最好能防止这些断言失败,否则我会以禁用断言。

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

相关内容

最新更新