void insert_constraint(CT& ct,PointIterator first, PointIterator last, bool close=false) { typedef typename CT::Vertex_handle VertexHandle; typedef typename CT::Geom_traits::Point_2 Point; if(first == last){ return; } const Point& p0 = *first; Point p = p0; VertexHandle v0 = ct.insert(p0), v(v0), w(v0); ++first; for(; first!=last; ++first){ const Point& q = *first; if(p != q){ w = ct.insert(q); ct.insert_constraint(v,w); v = w; p = q; } } if(close && (p != p0)){ ct.insert(w,v0); } }
int main() { CT ct; Polygon_2 P; while(std::cin >> P){ ct.insert_constraint(P); } PS::simplify(ct, Cost(), Stop(0.5)); for(Constraint_iterator cit = ct.constraints_begin(); cit != ct.constraints_end(); ++cit) { std::cout << "simplified polyline" << std::endl; for(Points_in_constraint_iterator vit = ct.points_in_constraint_begin(*cit); vit != ct.points_in_constraint_end(*cit); ++vit) std::cout << *vit << std::endl; } return 0; }
bool CGALBuilder::triangulate() { typedef CGAL::Triangulation_vertex_base_with_info_2<VertexInfo,CGAL::Kernel3> VertexBase; typedef CGAL::Triangulation_face_base_with_info_2<FaceInfo,CGAL::Kernel3> Info; typedef CGAL::Constrained_triangulation_face_base_2<CGAL::Kernel3,Info> FaceBase; typedef CGAL::Triangulation_data_structure_2<VertexBase,FaceBase> TDS; typedef CGAL::Exact_predicates_tag Tag; typedef CGAL::Constrained_triangulation_2<CGAL::Kernel3,TDS,Tag> CT; typedef CT::Vertex_handle VertexHandle; typedef CT::Face_iterator FaceIterator; QList<CGAL::Point3> points3=primitive.getPoints(); int total=points3.size(); if(total<3) return false; else if(total==3) return true; CT ct; TDS::size_type count=0; for(CGALPolygon* pg: primitive.getCGALPolygons()) { QList<int> indexes=pg->getIndexes(); if(indexes.size()<3) continue; CGALProjection* pro=pg->getProjection(); QList<CGAL::Point2> points2; for(auto i: indexes) { CGAL::Point2 p2=pro->project(points3.at(i)); VertexHandle h=ct.insert(p2); h->info().index = i; points2.append(p2); ++count; } #if CGAL_VERSION_NR < CGAL_VERSION_NUMBER(4,6,0) insert_constraint(ct,points2.begin(),points2.end(),true); #else ct.insert_constraint(points2.begin(),points2.end(),true); #endif } if(count<3||ct.number_of_vertices()<count) return false; if(ct.number_of_faces()>3) markDomains(ct); primitive.clearPolygons(); for(FaceIterator f=ct.finite_faces_begin(); f!=ct.finite_faces_end(); ++f) { if(f->info().inDomain()) { auto* pg=primitive.createCGALPolygon(); for(auto i=0; i<3; ++i) { VertexInfo info=f->vertex(i)->info(); if(info.isValid()) pg->append(info.index); } pg->calculatePlane(); } } return true; }