CGAL :: insert有时会违反声明。我不能肯定地说 有问题的场景具有共同点,但是它们似乎常常涉及到一条曲线终止于另一条曲线的中间。我整理了一个最小的 例。对我来说(Windows 8.1,在QtCreator中运行的MSVC2015,CGAL 4.14), 这在调试模式下在第234行的断言中失败 No_intersection_surface_sweep_2_impl.h:
CGAL_assertion((m_statusLine.size() == 0));
在发布模式下,我的整个系统都挂起,直到可以杀死令人讨厌的进程为止。
任何人都可以复制吗?我是在做错什么,还是一个错误?以前在将Bezier曲线插入排列中存在一些错误-有关早期CGAL版本中自解决问题的信息,请参见this线程。
main.cpp:
#include <CGAL/Cartesian.h>
#include <CGAL/CORE_algebraic_number_traits.h>
#include <CGAL/Arr_Bezier_curve_traits_2.h>
#include <CGAL/Arrangement_2.h>
#include <sstream>
using NtTraits = CGAL::CORE_algebraic_number_traits;
using Rational = NtTraits::Rational;
using Algebraic = NtTraits::Algebraic;
using RationalKernel = CGAL::Cartesian< Rational >;
using AlgebraicKernel = CGAL::Cartesian< Algebraic >;
using ArrTraits = CGAL::Arr_Bezier_curve_traits_2< RationalKernel,
AlgebraicKernel, NtTraits >;
using BezierCurve2 = ArrTraits::Curve_2;
using Arrangement = CGAL::Arrangement_2< ArrTraits >;
int main()
{
// Change 10.1 to 10 and problem goes away.
const std::string curvesData =
"2 \
2 -10 0 10.1 0 \
2 10 10 10 0 ";
std::istringstream stream( curvesData );
std::vector< BezierCurve2 > curvesToInsert;
size_t numCurves = 0;
stream >> numCurves;
for( size_t i = 0; i < numCurves; i++ ) {
BezierCurve2 curve;
stream >> curve;
curvesToInsert.push_back( curve );
}
Arrangement arr;
// Assertion violation here.
CGAL::insert( arr, curvesToInsert.begin(), curvesToInsert.end() );
return 0;
}