CGAL 4.7:安排插入(arr、开始、结束)崩溃
CGAL 4.7: Arrangement insert(arr,begin,end) crashes
我正在尝试聚合插入 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 版本是 4.7,但我用 4.5.2 和最新的 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 版中没有看到此修复。可能它在代码的其他地方被修复了,或者这个修复不知何故丢失了。?反正好像和我的问题无关,但谁知道呢
我能够重现该问题,乍一看它像是一个错误。我们正在调查它,但目前您有 2 个选项可以解决此问题:
1.使用增量插入。增量插入基于完全不同的算法。
2. 将每条多段线分成线段并构建线段排列而不是多段线排列。我已经用产生您提供的问题的最小示例对其进行了测试(顺便说一句,您)并且它工作正常。
BW,你说的link与此无关
我正在尝试聚合插入 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 版本是 4.7,但我用 4.5.2 和最新的 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 版中没有看到此修复。可能它在代码的其他地方被修复了,或者这个修复不知何故丢失了。?反正好像和我的问题无关,但谁知道呢
我能够重现该问题,乍一看它像是一个错误。我们正在调查它,但目前您有 2 个选项可以解决此问题: 1.使用增量插入。增量插入基于完全不同的算法。 2. 将每条多段线分成线段并构建线段排列而不是多段线排列。我已经用产生您提供的问题的最小示例对其进行了测试(顺便说一句,您)并且它工作正常。
BW,你说的link与此无关