Бесконечный цикл во время CGAL::Delaunay_triangulation_3

Я использую библиотеку CGAL для триангуляции трехмерного облака точек. Иногда приложение работает нормально, но в большинстве случаев оно зависает. Он входит в бесконечный цикл при вставке новой трехмерной точки в триангуляцию. Эта проблема у меня возникает только в Windows, в Linux она всегда работает нормально. Я использую CGAL 4.6 x64 с ядром Exact_predicates_inexact_constructions_kernel с Visual Studio 2012/2015 в Windows 8.1 x64 и GCC в Ubuntu 14.04 x64.

Любые предложения о том, как исправить эту проблему в сборке Windows?

ОБНОВЛЕНИЕ. Перейдите по этой ссылке, чтобы найти минимальный код для воспроизведения проблемы и пример набора данных: https://drive.google.com/file/d/0B8bb0qT4PvT8V2hqUEt0RUstLTg Проблема, по-видимому, заключается в оптимизированной процедуре поиска ближайшей точки и вставки новой точки (две части кода, выбранные перед компиляцией, эквивалентны, но второй оптимизирован двумя способами: использовать только один locate() вместо двух и не выделять/использовать std::vector для каждой точки).


person cDc    schedule 04.06.2015    source источник
comment
предоставьте mcve   -  person BeyelerStudios    schedule 04.06.2015
comment
пожалуйста, найдите mcve в обновленном вопросе   -  person cDc    schedule 05.06.2015
comment
Какие параметры компилятора вы используете? CGAL полагается на точное округление двойных операций.   -  person Marc Glisse    schedule 05.06.2015
comment
все флаги компиляции находятся в CMakeList.txt, распространяемом вместе с кодом; чтобы быть совместимым с CGAL в Linux, я вынужден использовать -frounding-math   -  person cDc    schedule 05.06.2015
comment
В Windows вы должны использовать флаг компилятора /fp:strict, и вы можете добавить /fp:except-, чтобы немного ослабить строгость. Редактировать: я видел ваш CMakeLists.txt, и я уверен, что это может быть причиной сбоя. Я, вероятно, должен продвигать этот комментарий к официальному ответу.   -  person lrineau    schedule 11.06.2015
comment
@Irineau: Спасибо за ваше предложение, однако, даже если оно не отображается в CMakeList.txt, я уже пробовал с установкой этих флагов и без них в Windows, и это не имеет значения. Итак, если эти флаги являются проблемой, они являются лишь частью проблемы, должно быть и что-то еще.   -  person cDc    schedule 11.06.2015


Ответы (1)


Я думаю, что ошибка в вашем struct adjacent_vertex_back_inserter_t. operator= должно быть следующим:

    inline void operator=(const vertex_handle_t& w) {
      assert(! delaunay.is_infinite(v))
        if ( !delaunay.is_infinite(w) && (delaunay.geom_traits().compare_distance_3_object()(p, w->point(), v->point()) == CGAL::SMALLER)){
          v = w;
      }
person Andreas Fabri    schedule 15.06.2015
comment
Действительно, я тестировал, и это решает проблему в Windows; Спасибо. Тем не менее я нахожу немного странным, что в Linux проблема не проявляется, и результат соответствует ожидаемому. Вот почему я не стал трижды проверять код, я был уверен, что это связано только с платформой. - person cDc; 16.06.2015