CGAL 4.7:排列插入(arr,开始,结束)崩溃

时间:2015-12-29 12:37:26

标签: cgal

我试图进行x单调折线的聚合插入,但是我收到以下错误:

terminate called after throwing an instance of 'CGAL::Precondition_exception'
  what():  CGAL ERROR: precondition violation!
Expr: i != INVALID_INDEX
File: /home/vladimir/lib-cgal/include/CGAL/Arr_polycurve_basic_traits_2.h
Line: 727

并且不知道为什么会发生这种情况。我错过了什么吗?我的输入错了吗?或者这是一个错误?以下是导致此行为的代码段:

#include <vector>

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Arr_segment_traits_2.h>
#include <CGAL/Arr_polyline_traits_2.h>
#include <CGAL/Arrangement_2.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel   Kernel;
typedef Kernel::Point_2                                     Point_2;
typedef CGAL::Arr_segment_traits_2<Kernel>                  Segment_traits_2;
typedef CGAL::Arr_polyline_traits_2<Segment_traits_2>       Geom_traits_2;
typedef CGAL::Arrangement_2<Geom_traits_2>                  Arrangement_2;

int main()
{
    Arrangement_2 arr;
    std::vector<Geom_traits_2::X_monotone_curve_2> segments;

    {
        auto ctor = arr.geometry_traits()->construct_x_monotone_curve_2_object();

        typedef std::vector<Point_2> Line;
        std::vector<Line> lines = {
            {{0,0}, {8,0}},
            {{2,0}, {7,0}},
            {{4,2}, {6,3}},
            {{1,1}, {3,0}, {5,0}},
        };

        for (auto &line: lines) {
            segments.push_back(ctor(line.begin(), line.end()));
        }
    }

    insert(arr, segments.begin(), segments.end());

    return 0;
}

CGAL版本I使用的是4.7,但我尝试使用4.5.2和lates git版本(81d638341),结果相同。

线条相交,但据我所知,这应该没问题。我观察到将{{1,1}, {3,0}, {5,0}}更改为{{2,1}, {3,0}, {5,0}}会导致错误。将{{1,1}, {3,0}, {5,0}}拆分为两个细分{{1,1}, {3,0}}, {{3,0}, {5,0}}也会导致错误。

我还注意到另一个线程(link)有类似问题已修复,但我在版本4.7中看不到此修复。可能它已经修复了代码中的其他地方,或者这个修复程序可能会以某种方式丢失。无论如何,看起来它与我的问题没有关系,但是人们从不知道。

1 个答案:

答案 0 :(得分:0)

我能够重现这个问题,乍一看它看起来像个bug。我们正在研究它,但是现在你有2种选择来解决这个问题: 1.使用增量插入。增量插入基于完全不同的算法。 2.将每条折线分成若干段,并构建一个段的排列,而不是折线的排列。我用最小的例子测试了它,它产生了你提供的问题(顺便提一下),它运行正常。

BW,你提到的链接是无关的。