2011-06-17 88 views
1

使用GNU Triangulated曲面庫進行約束Delaunay三角測量時,我得到一些間歇斷言失敗。我見過的每一個在不同的時間如下:使用GTS約束Delaunay三角剖分的聲明失敗

GTS:ERROR:cdt.c:974:remove_intersected_vertex:代碼不應該達到 GTS:ERROR: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]); 

仍然得到同樣的斷言失敗。

回答

1

The code that's using GTS needs to not crash even for bad input, so it would be nice to prevent these assertion failures, otherwise I'll have to disable the assertions.

我寫了一個補丁,導致GTS(基本上)拋出一個異常,而不是在觸發斷言失敗時停止。該補丁是here

1

如果您完全隨機創建頂點和約束,我想您可能會提供相互交叉的約束邊。在這種情況下,我一定會期待三角測量程序的投訴。

+0

謝謝,它可能會幫助刪除相交約束,但我仍然得到相同的斷言失敗。 (看我的編輯。) – jlstrecker

相關問題