示例#1
0
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);
	}
}
示例#2
0
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;
}
示例#3
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;
}