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

GTSを使用しているコードは、入力が正しくない場合でもクラッシュしないようにする必要があるため、これらのアサーションの失敗を防ぐと便利です。そうしないと、アサーションを無効にする必要があります。

結局、GTSがアサーションに失敗したときに停止するのではなく、(基本的に)例外をスローするパッチを作成しました。パッチはこちらです。

于 2013-01-27T04:14:20.373 に答える
1

頂点とコンストレイントを完全にランダムに作成している場合は、互いに交差するコンストレイントエッジを指定している可能性があります。その場合、私は確かに三角測量ルーチンが文句を言うことを期待します。

于 2011-06-17T16:39:26.653 に答える