我试图进行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中看不到此修复。可能它已经修复了代码中的其他地方,或者这个修复程序可能会以某种方式丢失。无论如何,看起来它与我的问题没有关系,但是人们从不知道。
答案 0 :(得分:0)
我能够重现这个问题,乍一看它看起来像个bug。我们正在研究它,但是现在你有2种选择来解决这个问题: 1.使用增量插入。增量插入基于完全不同的算法。 2.将每条折线分成若干段,并构建一个段的排列,而不是折线的排列。我用最小的例子测试了它,它产生了你提供的问题(顺便提一下),它运行正常。
BW,你提到的链接是无关的。