⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pm_visualizor.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997-2000  Max-Planck-Institute Saarbruecken (Germany).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Nef_2/include/CGAL/Nef_2/PM_visualizor.h $// $Id: PM_visualizor.h 28567 2006-02-16 14:30:13Z lsaboret $// //// Author(s)     : Michael Seel <seel@mpi-sb.mpg.de>#ifndef PM_VISUALIZOR_H#define PM_VISUALIZOR_H#include <CGAL/basic.h>#include <CGAL/Cartesian.h>#include <CGAL/IO/Window_stream.h>#if defined(CGAL_USE_CGAL_WINDOW)#define leda_color CGAL::color#endif#define LGREY CGAL::Color(190,190,190)#define DGREY CGAL::Color(130,130,130)CGAL_BEGIN_NAMESPACEtemplate <typename PMCDEC>class PM_BooleColor {  typedef typename PMCDEC::Vertex_const_handle Vertex_const_handle;     typedef typename PMCDEC::Halfedge_const_handle Halfedge_const_handle;   typedef typename PMCDEC::Face_const_handle Face_const_handle;  typedef typename PMCDEC::Mark Mark;public:  Color color(Vertex_const_handle, const Mark& m) const  { return ( m ? CGAL::BLACK : LGREY ); }  int width(Vertex_const_handle, const Mark& m) const  { return 3; }  Color color(Halfedge_const_handle, const Mark& m) const  { return ( m ? CGAL::BLACK : LGREY ); }  int width(Halfedge_const_handle, const Mark& m) const  { return 2; }  Color color(Face_const_handle, const Mark& m) const  { return ( m ? DGREY : CGAL::WHITE ); }};template <typename PMCDEC>class PM_DefColor {  CGAL::Color _cs, _cf;  int _wv, _we;public:  PM_DefColor() :     _cs(CGAL::BLACK), _cf(CGAL::WHITE), _wv(3), _we(2) {}  PM_DefColor(CGAL::Color cs, CGAL::Color cf, int wv, int we) :     _cs(cs), _cf(cf), _wv(wv), _we(we) {}  typedef typename PMCDEC::Vertex_const_handle Vertex_const_handle;     typedef typename PMCDEC::Halfedge_const_handle Halfedge_const_handle;   typedef typename PMCDEC::Face_const_handle Face_const_handle;  typedef typename PMCDEC::Mark Mark;  Color color(Vertex_const_handle, const Mark&) const  { return _cs; }  int width(Vertex_const_handle, const Mark&) const  { return _wv; }  Color color(Halfedge_const_handle, const Mark&) const  { return _cs; }  int width(Halfedge_const_handle, const Mark&) const  { return _we; }  Color color(Face_const_handle, const Mark&) const  { return _cf; }};/*{\Moptions outfile=PM_visualizor.man }*//*{\Manpage {PM_visualizor}{PMCDEC,GEOM,COLORDA}{Drawing plane maps}{V}}*/template <typename PMCDEC, typename GEOM,           typename COLORDA = PM_DefColor<PMCDEC> >class PM_visualizor : public PMCDEC{/*{\Mdefinition An instance |\Mvar| of the data type |\Mname| is adecorator to draw the structure of a plane map into a CGAL windowstream. It is generic with respect to two template concepts.  |PMCDEC|has to be a decorator model of our |PM_const_decorator|concept. |GEOM| has to be a model of our geometry kernel concept.The data accessor |COLORDA| has to have two members determiningthe visualization parameters of the objects of |P|:\\|CGAL::Color color(Vertex/Halfedge/Face_const_handle h) const|\\|int width(Vertex/Halfedge_const_handle h) const|.}*//*{\Mgeneralization PMCDEC}*//*{\Mtypes 3}*/public:  typedef PM_visualizor<PMCDEC,GEOM,COLORDA> Self;  typedef PMCDEC Base;  typedef typename PMCDEC::Plane_map Plane_map;  typedef typename PMCDEC::Vertex_const_handle Vertex_const_handle;     typedef typename PMCDEC::Halfedge_const_handle Halfedge_const_handle;   typedef typename PMCDEC::Face_const_handle Face_const_handle;       typedef typename PMCDEC::Vertex_const_iterator Vertex_const_iterator;  typedef typename PMCDEC::Halfedge_const_iterator Halfedge_const_iterator;  typedef typename PMCDEC::Face_const_iterator Face_const_iterator;  typedef typename PMCDEC::Halfedge_around_face_const_circulator     Halfedge_around_face_const_circulator;  typedef typename PMCDEC::Halfedge_around_vertex_const_circulator     Halfedge_around_vertex_const_circulator;  typedef typename PMCDEC::Hole_const_iterator Hole_const_iterator;  typedef typename PMCDEC::Isolated_vertex_const_iterator     Isolated_vertex_const_iterator;  typedef typename PMCDEC::Point Point;  typedef typename PMCDEC::Mark Mark;  typedef typename GEOM::Segment_2 Segment;  typedef CGAL::Cartesian<double>::Point_2 Draw_point;  typedef PMCDEC PM_const_decorator;  /*{\Mtypemember The plane map decorator.}*/  typedef GEOM Geometry;  /*{\Mtypemember The used geometry.}*/  typedef COLORDA Color_objects;  /*{\Mtypemember The color data accessor.}*/  CGAL::Window_stream& _W;  const Geometry& _K;  const Color_objects& _CO;/*{\Mcreation 4}*/PM_visualizor(CGAL::Window_stream& W,   const PM_const_decorator& D,  const Geometry& K = Geometry(),  const Color_objects& C = Color_objects() ) /*{\Mcreate creates an instance |\Mvar| of type |\Mname|    to visualize the vertices, edges, and faces of |D| in window |W|.    The coloring of the objects is determined by data accessor |C|.}*/  : Base(D), _W(W), _K(K), _CO(C) { _W.set_node_width(3);   _W.set_line_width(2);}/*{\Moperations 2 1}*/void draw(Vertex_const_handle v) const/*{\Mop draws |v| according to the color and width specified by    |C.color(v)| and |C.width(v)|.}*/{ int ow = _W.set_node_width(_CO.width(v,mark(v)));  _W << _CO.color(v,mark(v)) << point(v);  _W.set_node_width(ow);}void draw(Halfedge_const_handle e) const/*{\Mop draws |e| according to the color and width specified by    |C.color(e)| and |C.width(e)|.}*/{ int ow = _W.set_line_width(_CO.width(e,mark(e)));  Segment s = _K.construct_segment(point(source(e)),point(target(e)));  _W << _CO.color(e,mark(e)) << s;  _W.set_line_width(ow);}void draw_face_cycle(const std::list<Draw_point>& fc, int c) const{ int n = fc.size();  double* xc = new double[n];  double* yc = new double[n];  int i = 0;  std::list<Draw_point>::const_iterator it;  for (it = fc.begin(); it != fc.end(); ++i,++it)   { xc[i] = (*it).x(); yc[i] = (*it).y(); }  _W.clip_mask_polygon(n,xc,yc,c);  delete[] xc;  delete[] yc;}void get_point_list(std::list<Draw_point>& L,                     Halfedge_const_iterator e) const{  Halfedge_around_face_const_circulator fcirc(e), fend(fcirc);  CGAL_For_all(fcirc,fend) {    Point p = point(target(fcirc));    L.push_back(Draw_point(CGAL::to_double(p.x()),			   CGAL::to_double(p.y())));  }   }void draw(Face_const_handle f) const/*{\Mop draws |f| with color |C.color(f)|.}*/{   CGAL::Color cc = _CO.color(f,mark(f));  leda_color c (cc.r(),cc.g(),cc.b());  std::list<Draw_point> outer_cycle;  // First the outer face cycle:  get_point_list(outer_cycle,halfedge(f));  double x0 = _W.xmin();  double y0 = _W.ymin();  double x1 = _W.xmax();  double y1 = _W.ymax();  if ( _W.is_buffering() ) {    x0 = _W.xreal(0);    y0 = _W.yreal(_W.height());    x1 = _W.xreal(_W.width());    y1 = _W.yreal(0);  }  _W.reset_clip_mask();  std::list<Draw_point> frame;  frame.push_back(Draw_point(x0,y0));  frame.push_back(Draw_point(x1,y0));  frame.push_back(Draw_point(x1,y1));  frame.push_back(Draw_point(x0,y1));  frame.reverse();  draw_face_cycle(frame,0);   // enforcing transparent mode outside f and inside frame  draw_face_cycle(outer_cycle,1);  // drawing non-transparent outer face cycle  Hole_const_iterator hole_it;  for (hole_it = holes_begin(f); hole_it != holes_end(f); ++hole_it) {    std::list<Draw_point> hole;    get_point_list(hole,hole_it);    draw_face_cycle(hole,0);    // enforcing transparent mode for holes  }  Isolated_vertex_const_iterator iv_it;  for (iv_it = isolated_vertices_begin(f);        iv_it != isolated_vertices_end(f); ++iv_it) {    draw(iv_it);   }  _W.draw_box(x0,y0,x1,y1,c);  _W.reset_clip_mask();}void draw_map() const/*{\Mop draw the whole plane map.}*/{  Face_const_iterator     fit = faces_begin(), fend = faces_end();  // we don't draw the first face outside the box:  for ( ++fit; fit != fend; ++fit)     draw(fit);  // draw segments underlying halfedges:   Halfedge_const_iterator hit, hend = halfedges_end();  for (hit = halfedges_begin(); hit != hend; ++(++hit))     draw(hit);  // draw points underlying vertices:  Vertex_const_iterator vit, vend = vertices_end();  for (vit = vertices_begin(); vit != vend; ++vit)     draw(vit);}void init_window() const{ _W.set_show_coordinates(true); _W.init(-110,110,-110); _W.display();   _W.set_node_width(3); }void draw_skeleton(const CGAL::Color& c=CGAL::BLACK) const{   int old = _W.set_line_width(1);  _W << c;  Halfedge_const_iterator hit, hend = halfedges_end();  for (hit = halfedges_begin(); hit != hend; ++(++hit))    _W << _K.construct_segment(point(source(hit)),point(target(hit)));  // draw points underlying vertices:  Vertex_const_iterator vit, vend = vertices_end();  for (vit = vertices_begin(); vit != vend; ++vit)     _W << point(vit);  _W.set_line_width(old);}void draw_ending_bundle(Vertex_const_handle v,         const CGAL::Color& c=CGAL::BLACK){ if (is_isolated(v)) return;  _W << c;  Halfedge_around_vertex_const_circulator hc(first_out_edge(v)), hend(hc);  CGAL_For_all(hc,hend) {    Point p1=point(source(hc)), p2=point(target(hc));    if ( _K.compare_xy(p1,p2)>0 )      _W << _K.construct_segment(p1,p2);  }}}; // end of PM_visualizor CGAL_END_NAMESPACE#undef CGAL_USING#undef LGREY#undef DGREY#endif // PM_VISUALIZOR_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -