我遇到的问题可能是由于双精度和CGAL中给出的无限精度之间的不匹配,但我似乎无法解决它,并且无论如何也看不到设置公差。
我输入了一组点(最初的位置是双打)。
当点在上部水平对齐(并且只在那里发生)时,我有时(并非总是)会产生太多三角形(具有非常小的区域,几乎为0)的问题:参见图像
(*在上半部分注意,有一条线看起来比其他线条更厚,因为那里至少有3个三角形。)
这就是我在我的代码中所做的,我试图设置内核来处理双精度的不精确性:
typedef CGAL::Simple_cartesian<double> CK;
typedef CGAL::Filtered_kernel<CK> K;
//typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::FT FT;
typedef K::Point_2 Point;
typedef K::Segment_2 Segment;
typedef CGAL::Polygon_2<K> Polygon_2;
typedef CGAL::Triangulation_vertex_base_with_info_2<unsigned long, K> Vb2;
typedef CGAL::Triangulation_data_structure_2<Vb2,Fb> Tds2;
typedef CGAL::Delaunay_triangulation_2<K,Tds2> Delaunay;
std::vector<std::vector<long> > Geometry::delaunay(std::vector<double> xs,std::vector<double> ys){
std::vector<Point> points;
std::vector<unsigned long> indices;
points.resize(xs.size());
indices.resize(xs.size());
for(long i=0;i<xs.size();i++){
indices[i]=i;
points[i]=Point(xs[i],ys[i]);
}
std::vector<long> idAs;
std::vector<long> idBs;
Delaunay dt;
dt.insert( boost::make_zip_iterator(boost::make_tuple( points.begin(),indices.begin() )),boost::make_zip_iterator(boost::make_tuple( points.end(),indices.end() ) ) );
for(Delaunay::Finite_edges_iterator it = dt.finite_edges_begin(); it != dt.finite_edges_end(); ++it)
{
Delaunay::Edge e=*it;
long i1= e.first->vertex( (e.second+1)%3 )->info();
long i2= e.first->vertex( (e.second+2)%3 )->info();
idAs.push_back(i1);
idBs.push_back(i2);
}
std::vector<std::vector<long> > result;
result.resize(2);
result[0]=(idAs);
result[1]=(idBs);
return result;
}
我是CGAL的新手,这段代码是我在过去两天内在网页上查看很多内容之后能够整理出来的。所以如果还有其他可能会有所改进的地方,请不要犹豫,提及它,CGAL的sintaxis并不是那么简单。
*代码适用于随机点,70%的时间甚至是对齐点,但另外30%让我担心。
问题是,如何设置公差,因此CGAL不会在几乎几乎对齐的点上生成三角形,或者是否有更好的内核? (如你所见,我也尝试了Exact_predicates_inexact_constructions_kernel,但它甚至更糟)。