【问题标题】:Assertion failures in constrained Delaunay triangulation with GTS使用 GTS 进行约束 Delaunay 三角剖分中的断言失败
【发布时间】:2011-06-17 15:08:55
【问题描述】:

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

仍然遇到同样的断言失败。

【问题讨论】:

    标签: c triangulation


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这可能有助于消除相交约束,但我仍然遇到同样的断言失败。 (请参阅我的编辑。)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2013-12-06
      • 2015-01-07
      相关资源
      最近更新 更多