1

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

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

4

2 回答 2

1

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

于 2011-06-17T16:39:26.653 回答
1

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

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

于 2013-01-27T04:14:20.373 回答