Сбои утверждений в ограниченной триангуляции Делоне с GTS - PullRequest
1 голос
/ 17 июня 2011

Я получаю некоторые прерывистые ошибки утверждений при выполнении ограниченной триангуляции Делоне с библиотекой триангулированных поверхностей GNU. Я видел каждое из следующего в разное время:

Gts: ОШИБКА: cdt.c: 974: remove_intersected_vertex: код не должен быть достигнут Gts: ОШИБКА: 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]);

По-прежнему получаются те же ошибки подтверждения.

Ответы [ 2 ]

1 голос
/ 27 января 2013

Код, который использует GTS, не должен падать даже при неправильном вводе, поэтому было бы неплохо предотвратить эти ошибки утверждения, в противном случае я буду иметь чтобы отключить утверждения.

Я закончил тем, что написал патч, который заставляет GTS (в основном) генерировать исключение вместо остановки, когда он сталкивается с ошибкой подтверждения. Патч здесь .

1 голос
/ 17 июня 2011

Если вы создаете вершины и ограничения совершенно случайно, я полагаю, что вы можете предоставить ребра ограничения, которые пересекаются друг с другом.В этом случае я бы, конечно, ожидал, что процедуры триангуляции будут жаловаться.

...