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

📄 gps_traits_decorator.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2005  Tel-Aviv University (Israel).// 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/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h $// $Id: Gps_traits_decorator.h 37252 2007-03-19 11:46:33Z afabri $// //// Author(s)     : Baruch Zukerman <baruchzu@post.tau.ac.il>#ifndef CGAL_GPS_TRAITS_DECORATOR_H#define CGAL_GPS_TRAITS_DECORATOR_HCGAL_BEGIN_NAMESPACEtemplate <class Traits_, class Curve_data_, class Point_data_>class Gps_traits_decorator{public:  typedef Traits_                              Base;  typedef typename Base::X_monotone_curve_2    Base_X_monotone_curve_2;  typedef typename Base::Point_2               Base_Point_2;  typedef Gps_traits_decorator<Traits_, Curve_data_, Point_data_>    Self;  typedef Curve_data_                          Curve_data;  typedef Point_data_                          Point_data;  typedef typename Base::Compare_x_2               Base_Compare_x_2;  typedef typename Base::Compare_xy_2              Base_Compare_xy_2;  typedef typename Base::Construct_min_vertex_2    Base_Construct_min_vertex_2;  typedef typename Base::Construct_max_vertex_2    Base_Construct_max_vertex_2;  typedef typename Base::Is_vertical_2             Base_Is_vertical_2;  typedef typename Base::Compare_y_at_x_2          Base_Compare_y_at_x_2;  typedef typename Base::Compare_y_at_x_right_2    Base_Compare_y_at_x_right_2;  typedef typename Base::Equal_2                   Base_Equal_2;  typedef typename Base::Split_2                   Base_Split_2;  typedef typename Base::Intersect_2               Base_Intersect_2;  typedef typename Base::Compare_endpoints_xy_2    Base_Compare_endpoints_xy_2;  typedef typename Base::Construct_opposite_2      Base_Construct_opposite_2;  typedef typename Base::Has_boundary_category     Has_boundary_category;  typedef typename Base::Has_left_category         Has_left_category;  typedef typename Base::Has_merge_category        Has_merge_category;    class Ex_point_2   {  protected:    Base_Point_2 m_base;    Point_data   m_data;  public:    Ex_point_2(): m_base(),                  m_data()    {}    Ex_point_2(const Base_Point_2& pt) : m_base(pt),                                         m_data()    {}    Ex_point_2(const Base_Point_2& pt, const Point_data& data): m_base(pt),                                                                m_data(data)    {}    const Base_Point_2& base() const    {      return m_base;    }    Base_Point_2& base()    {      return m_base;    }    operator const Base_Point_2& () const    {      return (m_base);    }    Point_data& data()    {      return m_data;    }    const Point_data& data() const    {      return m_data;    }    void set_data(const Point_data& data)    {      m_data = data;    }  };  class Ex_x_monotone_curve_2  {  protected:    Base_X_monotone_curve_2    m_base;    Curve_data                 m_data;        public:    Ex_x_monotone_curve_2(): m_base(),                             m_data()    {}    Ex_x_monotone_curve_2(const Base_X_monotone_curve_2& pt) : m_base(pt),                                                               m_data()    {}    Ex_x_monotone_curve_2(const Base_X_monotone_curve_2& pt,                           const Curve_data& data): m_base(pt),                                                   m_data(data)    {}    const Base_X_monotone_curve_2& base() const    {      return m_base;    }    Base_X_monotone_curve_2& base()    {      return m_base;    }    operator const Base_X_monotone_curve_2& () const    {      return (m_base);    }    Curve_data& data()    {      return m_data;    }    const Curve_data& data() const    {      return m_data;    }    void set_data(const Curve_data& data)    {      m_data = data;    }  };  friend std::ostream& operator<< (std::ostream& os, const Ex_x_monotone_curve_2 & cv)  {    os << cv.base();    return (os);  }  friend std::ostream& operator<< (std::ostream& os, const Ex_point_2 & pt)  {    os << pt.base();    return (os);  }  typedef Ex_point_2                Point_2;  typedef Ex_x_monotone_curve_2     X_monotone_curve_2;  protected:  //Data members  Base*    m_base_tr;  bool     m_traits_owner;public:    Gps_traits_decorator() : m_base_tr(new Base()),			   m_traits_owner(true)  {}  Gps_traits_decorator(Base& base_traits) :    m_base_tr(&base_traits),    m_traits_owner(false)  {}  ~Gps_traits_decorator()  {    if(m_traits_owner)      delete m_base_tr;  }  class Compare_x_2  {  protected:    Base_Compare_x_2 m_base;  public:    Compare_x_2(Base_Compare_x_2& base) :m_base(base)    {}    Comparison_result operator() (const Point_2& p1, const Point_2& p2) const    {      return (m_base(p1.base(), p2.base()));    }  };  /*! Get a Compare_x_2 functor object. */  Compare_x_2 compare_x_2_object () const  {    return Compare_x_2(m_base_tr->compare_x_2_object());  }  class Compare_xy_2  {  protected:    Base_Compare_xy_2 m_base;  public:    Compare_xy_2(const Base_Compare_xy_2& base) :m_base(base)    {}    Comparison_result operator() (const Point_2& p1, const Point_2& p2) const    {      return (m_base(p1.base(), p2.base()));    }  };  /*! Get a Compare_xy_2 functor object. */  Compare_xy_2 compare_xy_2_object () const  {    return Compare_xy_2(m_base_tr->compare_xy_2_object());  }  class Construct_min_vertex_2  {  protected:    Base_Construct_min_vertex_2 m_base;  public:    Construct_min_vertex_2(const Base_Construct_min_vertex_2& base) :m_base(base)    {}    Point_2 operator() (const X_monotone_curve_2& cv) const    {      return Point_2(m_base(cv.base()));    }  };  /*! Get a Construct_min_vertex_2 functor object. */  Construct_min_vertex_2 construct_min_vertex_2_object () const  {    return Construct_min_vertex_2(m_base_tr->construct_min_vertex_2_object());  }  class Construct_max_vertex_2  {  protected:    Base_Construct_max_vertex_2 m_base;  public:    Construct_max_vertex_2(const Base_Construct_max_vertex_2& base) :m_base(base)    {}    Point_2 operator() (const X_monotone_curve_2& cv) const    {      return Point_2(m_base(cv.base()));    }  };  /*! Get a Construct_max_vertex_2 functor object. */  Construct_max_vertex_2 construct_max_vertex_2_object () const  {    return Construct_max_vertex_2(m_base_tr->construct_max_vertex_2_object());  }  class Is_vertical_2  {  protected:    Base_Is_vertical_2 m_base;  public:    Is_vertical_2(const Base_Is_vertical_2& base) :m_base(base)    {}    bool operator() (const X_monotone_curve_2& cv) const    {      return (m_base(cv.base()));    }  };  /*! Get a Is_vertical_2 functor object. */  Is_vertical_2 is_vertical_2_object() const  {    return Is_vertical_2(m_base_tr->is_vertical_2_object());  }  class Compare_y_at_x_2  {  protected:    Base_Compare_y_at_x_2 m_base;  public:    Compare_y_at_x_2(const Base_Compare_y_at_x_2& base) :m_base(base)    {}    Comparison_result operator() (const Point_2& p,                                  const X_monotone_curve_2& cv) const    {      return m_base(p.base(), cv.base());    }  };  /*! Get a compare_y_at_x_2_object functor object. */  Compare_y_at_x_2 compare_y_at_x_2_object() const  {    return Compare_y_at_x_2(m_base_tr->compare_y_at_x_2_object());  }  class Compare_y_at_x_right_2  {  protected:    Base_Compare_y_at_x_right_2 m_base;  public:    Compare_y_at_x_right_2(const Base_Compare_y_at_x_right_2& base) :m_base(base)    {}    Comparison_result operator() (const X_monotone_curve_2& cv1,                                  const X_monotone_curve_2& cv2,                                  const Point_2& p) const    {      return m_base(cv1.base(), cv2.base(), p.base());    }  };  /*! Get a Compare_y_at_x_right_2 functor object. */  Compare_y_at_x_right_2 compare_y_at_x_right_2_object() const  {    return Compare_y_at_x_right_2(m_base_tr->compare_y_at_x_right_2_object());  }  class Equal_2  {  protected:    Base_Equal_2 m_base;  public:    Equal_2(const Base_Equal_2& base) :m_base(base)    {}    bool operator() (const Point_2& p1, const Point_2& p2) const    {      return m_base(p1.base(), p2.base());    }  };  /*! Get a Equal_2 functor object. */  Equal_2 equal_2_object() const  {    return Equal_2(m_base_tr->equal_2_object());  }  class Split_2  {  protected:    Base_Split_2 m_base;  public:    Split_2(const Base_Split_2& base) :m_base(base)    {}    void operator() (const X_monotone_curve_2& cv,                     const Point_2& p,                     X_monotone_curve_2& c1, X_monotone_curve_2& c2) const    {      m_base(cv.base(), p.base(), c1.base(), c2.base());    }  };  /*! Get a Split_2 functor object. */  Split_2 split_2_object() const  {    return Split_2(m_base_tr->split_2_object());  }  class Intersect_2  {  protected:    Base_Intersect_2             m_base;    Base_Compare_xy_2            m_base_cmp_xy;    Base_Construct_min_vertex_2  m_ctr_min_v;  public:    Intersect_2(Base_Intersect_2&            base,                Base_Compare_xy_2&           base_cmp_xy,                Base_Construct_min_vertex_2& base_ctr_min_v) :      m_base(base),      m_base_cmp_xy(base_cmp_xy),      m_ctr_min_v(base_ctr_min_v)    {}    template<class OutputIterator>    OutputIterator operator() (const X_monotone_curve_2& cv1,                               const X_monotone_curve_2& cv2,                               OutputIterator oi) const    {      const std::pair<Base_Point_2, unsigned int>   *base_pt;      const Base_X_monotone_curve_2                 *overlap_cv;       OutputIterator oi_end;      if(m_base_cmp_xy(m_ctr_min_v(cv1.base()),                       m_ctr_min_v(cv2.base())) == LARGER)        oi_end = m_base(cv1.base(), cv2.base(), oi);      else        oi_end = m_base(cv2.base(), cv1.base(), oi);      // convert objects that are associated with Base_X_monotone_curve_2 to      // the extenede X_monotone_curve_2       for(; oi != oi_end; ++oi)      {        base_pt = object_cast<std::pair<Base_Point_2, unsigned int> >(&(*oi));        if (base_pt != NULL)        {          Point_2 point_plus (base_pt->first); // the extended point          *oi = CGAL::make_object(std::make_pair(point_plus,                                                  base_pt->second));        }        else        {          overlap_cv = object_cast<Base_X_monotone_curve_2> (&(*oi));          CGAL_assertion(overlap_cv != NULL);          *oi = CGAL::make_object (X_monotone_curve_2 (*overlap_cv));        }      }      //return past-end iterator      return oi_end;    }      };  /*! Get a Intersect_2 functor object. */  Intersect_2 intersect_2_object() const  {    return Intersect_2(m_base_tr->intersect_2_object(),                       m_base_tr->compare_xy_2_object(),                       m_base_tr->construct_min_vertex_2_object());  }  class Compare_endpoints_xy_2  {  protected:    Base_Compare_endpoints_xy_2 m_base;  public:    Compare_endpoints_xy_2(const Base_Compare_endpoints_xy_2& base) :m_base(base)    {}    Comparison_result operator()(const X_monotone_curve_2& cv)    {      return (m_base(cv));    }  };  /*! Get a Compare_endpoints_xy_2 functor object. */  Compare_endpoints_xy_2 compare_endpoints_xy_2_object() const  {    return Compare_endpoints_xy_2(m_base_tr->compare_endpoints_xy_2_object());  }  class Construct_opposite_2  {  protected:    Base_Construct_opposite_2 m_base;  public:    Construct_opposite_2(Base_Construct_opposite_2& base) :m_base(base)    {}    X_monotone_curve_2 operator()(const X_monotone_curve_2& cv)    {      return (X_monotone_curve_2(m_base(cv)));    }  };  /*! Get a Construct_opposite_2 functor object. */  Construct_opposite_2 construct_opposite_2_object() const  {    return Construct_opposite_2(m_base_tr->construct_opposite_2_object());  }};CGAL_END_NAMESPACE#endif

⌨️ 快捷键说明

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