.. role:: blue :class: blue Сеточные итераторы ================== .. _Mesh_Iterators: .. версия ядра: 118027 Для работы с топологией сетки предусмотрено несколько типов итераторов. Они находятся в заголовочных файлах *halfedge_iterators.h* и *halfedge_range_iterators.h*: 1. :blue:`EdgeFanIterator` – итератор для обхода рёбер веера вершины в направлении против часовой стрелки (см. рис. 1). Пример использования: .. code-block:: cpp for( EdgeFanIterator it( halfedge, iEd ); !it.Done(); ++it ); или:: for( EdgeFanIterator it( halfedge, iVx, true ); !it.Done(); ++it ) { if( it.Edge() < SYS_MAX_T ) { ... } if( it.Twin() < SYS_MAX_T ) { ... } } .. figure:: ../../pictures/P.2.2.1.png :width: 18cm :align: center Рис. 1 2. :blue:`EdgeFacetIterator` – итератор для обхода рёбер фасета, начиная с ребра фасета, в направлении против часовой стрелки (см. рис. 2). Пример использования: .. code-block:: cpp for( EdgeFacetIterator it( halfedge, iFacet ); !it.Done(); ++it ) { const MbHalfedgeEdge & ed = halfedge.Edge( it.Edge() ); } 3. :blue:`EdgesAroundFacetBegEndPair` AllEdgesAroundFacet( *size_t* iFacet ) const; Диапазон для обхода рёбер фасета, начиная с ребра фасета в направлении против часовой стрелки (см. рис. 2). Пример использования: .. code-block:: cpp for( const MbHalfedgeEdge & ed : halfedge.AllEdgesAroundFacet( iFacet ) ) { ... } .. figure:: ../../pictures/P.2.2.2.png :width: 15cm :align: center Рис. 2 4. :blue:`VerticesAroundFacetBegEndPair` AllVerticesAroundFacet( *size_t* iF ) const; Диапазон для обхода всех вершин вокруг фасета, начиная с вершины, принадлежащей ребру, определяющему фасет, против часовой стрелки (см. рис. 3). Пример использования: .. code-block:: cpp for( const MbHalfedgeVertex & v : halfedge.AllVerticesAroundFacet( iFacet ) ) { ... } .. figure:: ../../pictures/P.2.2.3.png :width: 15cm :align: center Рис. 3 5. :blue:`EdgesAroundVertexBegEndPair` AllEdgesAroundVertex( *size_t* iV ) const; Диапазон для обхода всех рёбер (входящих и исходящих), смежных с вершиной, начиная с ребра, определяющего вершину (см. рис. 4). Порядок обхода – против часовой стрелки, с чередованием входящих и исходящих рёбер. Пример использования: .. code-block:: cpp for( const MbHalfedgeEdge & ed : halfedge.AllEdgesAroundVertex( iVx ) ) { ... } .. figure:: ../../pictures/P.2.2.4.png :width: 18cm :align: center Рис. 4 6. :blue:`VerticesAroundVertexBegEndPair` AllVerticesAroundVertex( *size_t* iV ) const; Диапазон для обхода всех вершин, смежных с данной вершиной (см. рис. 5). Порядок обхода – против часовой стрелки, первая вершина смежна по ребру, определяющему вершину. Пример использования:: for( const MbHalfedgeVertex & v : halfedge.AllVerticesAroundVertex( iVx ) ) { ... } .. figure:: ../../pictures/P.2.2.5.png :width: 18cm :align: center Рис. 5 7. :blue:`FacetsAroundVertexBegEndPair` AllFacetsAroundVertex( *size_t* iV ) const; Диапазон для обхода всех фасетов, включающих данную вершину (см. рис. 6). Порядок обхода – против часовой стрелки, первый фасет включает ребро, определяющее вершину. Пример использования: .. code-block:: cpp for( const MbHalfedgeFacet & f : halfedge.AllFacetsAroundVertex( iVx ) ) { ... } .. figure:: ../../pictures/P.2.2.6.png :width: 18cm :align: center Рис. 6