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

📄 polygon_2_edge_circulator.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997  Utrecht University (The Netherlands),// ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany),// INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg// (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria),// and Tel-Aviv University (Israel).  All rights reserved.//// This file is part of CGAL (www.cgal.org); you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; version 2.1 of the License.// See the file LICENSE.LGPL 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/Polygon/include/CGAL/Polygon_2/Polygon_2_edge_circulator.h $// $Id: Polygon_2_edge_circulator.h 31310 2006-05-29 07:28:42Z wein $// //// Author(s)     : Wieger Wesselink <wieger@cs.ruu.nl>#ifndef CGAL_POLYGON_2_EDGE_CIRCULATOR_H#define CGAL_POLYGON_2_EDGE_CIRCULATOR_H#include <iterator>#include <CGAL/circulator.h>#include <CGAL/Polygon_2/Polygon_2_vertex_circulator.h>#include <CGAL/Polygon_2/polygon_assertions.h>CGAL_BEGIN_NAMESPACE//-----------------------------------------------------------------------////                          Polygon_2_const_edge_circulator//-----------------------------------------------------------------------//// Ideally the class Polygon_2_const_edge_circulator would be a nested// class of Polygon_2, but this leads to compiler problems with// SGI C++ 4.0 with the iterator_category() functiontemplate <class _Traits, class _Container> class Polygon_2;template <class _Traits, class _Container>class Polygon_2_const_edge_circulator {  public:    typedef _Traits Traits;    typedef typename _Traits::Segment_2 Segment_2;    typedef _Container Container;//    typedef Bidirectional_const_circulator_from_container<_Container>    typedef Polygon_circulator<_Container>            Vertex_const_circulator;    typedef Segment_2                            value_type;    typedef typename _Container::difference_type difference_type;    typedef typename _Container::size_type       size_type;    typedef Segment_2*                           pointer;    typedef const Segment_2*                     const_pointer;    typedef Segment_2&                           reference;    typedef const Segment_2&                     const_reference;    typedef Bidirectional_circulator_tag    iterator_category;  private:    Vertex_const_circulator first_vertex;  public:    Polygon_2_const_edge_circulator() {}    Polygon_2_const_edge_circulator(Vertex_const_circulator f)      : first_vertex(f) {}    bool operator==( CGAL_NULL_TYPE p ) const {      CGAL_polygon_assertion( p == 0);      return (first_vertex == 0);    }    bool operator!=( CGAL_NULL_TYPE p ) const    {      return !(*this == p);    }    bool    operator==(      const Polygon_2_const_edge_circulator<_Traits, _Container>& x) const    {      return first_vertex == x.first_vertex;    }    bool    operator!=(      const Polygon_2_const_edge_circulator<_Traits, _Container>& x) const    {      return !(first_vertex == x.first_vertex);    }    Segment_2 operator*() const    {      Vertex_const_circulator second_vertex = first_vertex;      ++second_vertex;      typename Traits::Construct_segment_2 construct_segment_2 =             Traits().construct_segment_2_object();      return construct_segment_2(*first_vertex, *second_vertex);    }    Polygon_2_const_edge_circulator<_Traits, _Container>& operator++()    {      ++first_vertex;      return *this;    }    Polygon_2_const_edge_circulator<_Traits, _Container> operator++(int)    {      Polygon_2_const_edge_circulator<_Traits, _Container> tmp = *this;      ++*this;      return tmp;    }    Polygon_2_const_edge_circulator<_Traits, _Container>& operator--()    {      --first_vertex;      return *this;    }    Polygon_2_const_edge_circulator<_Traits, _Container> operator--(int)    {      Polygon_2_const_edge_circulator<_Traits, _Container> tmp = *this;      --*this;      return tmp;    }// random access iterator requirements    Polygon_2_const_edge_circulator<_Traits, _Container>&    operator+=(difference_type n)    {      first_vertex += n;      return *this;    }    Polygon_2_const_edge_circulator<_Traits, _Container>    operator+(difference_type n)    {      return Polygon_2_const_edge_circulator<_Traits, _Container>(        this->container, first_vertex + n);    }    Polygon_2_const_edge_circulator<_Traits, _Container>&    operator-=(difference_type n)    {      return (*this) -= n;    }    Polygon_2_const_edge_circulator<_Traits, _Container>    operator-(difference_type n)    {      return Polygon_2_const_edge_circulator<_Traits, _Container>(        this->container, first_vertex - n);    }    difference_type    operator-(      const Polygon_2_const_edge_circulator<_Traits, _Container>& a)    {      return first_vertex - a.first_vertex;    }    Segment_2 operator[](int n)    {      return *Polygon_2_const_edge_circulator<_Traits, _Container>(        this->container, first_vertex+n);    }    bool operator<(      const Polygon_2_const_edge_circulator<_Traits, _Container>& a)    {      return first_vertex < a.first_vertex;    }    bool operator>(      const Polygon_2_const_edge_circulator<_Traits, _Container>& a)    {      return first_vertex > a.first_vertex;    }    bool operator<=(      const Polygon_2_const_edge_circulator<_Traits, _Container>& a)    {      return first_vertex <= a.first_vertex;    }    bool operator>=(      const Polygon_2_const_edge_circulator<_Traits, _Container>& a)    {      return first_vertex >= a.first_vertex;    }};/*template <class _Traits, class _Container>typename _Container::difference_typedistance_type(  const Polygon_2_const_edge_circulator<_Traits,_Container>&){  return typename _Container::difference_type();}template <class _Traits, class _Container>typename _Traits::Segment_2*value_type(const Polygon_2_const_edge_circulator<_Traits,_Container>&){  return (typename _Traits::Segment_2*)(0);}*///-----------------------------------------------------------------------////                          implementation//-----------------------------------------------------------------------////--------------------------------------------------------------------//// I don't know how to implement the following function://// template <class _Traits, class _Container>// inline// Polygon_2_const_edge_circulator<_Traits, _Container>// operator+(_Container::difference_type n,//           Polygon_2_const_edge_circulator<_Traits, _Container>& a)// { return a+n; }//--------------------------------------------------------------------//CGAL_END_NAMESPACE#endif

⌨️ 快捷键说明

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