Rev 511 | Rev 518 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/* ----------------------------------------------------------------------- *
* This file is part of GEL, www.imm.dtu.dk/GEL
* Copyright (C) the authors (see AUTHORS.txt) and DTU Informatics
*
* Principal authors:
* Christian Thode Larsen (thode2d@gmail.com)
* J. Andreas Baerentzen (jab@imm.dtu.dk)
*
* See LICENSE.txt for licensing information
* ----------------------------------------------------------------------- */
#ifndef __HMESH_HALFEDGEWALKER_H__
#define __HMESH_HALFEDGEWALKER_H__
#include "ConnectivityKernel.h"
namespace HMesh
{
class HalfEdgeWalker
{
public:
HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current);
HalfEdgeWalker next() const;
HalfEdgeWalker prev() const;
HalfEdgeWalker opp() const;
HalfEdgeWalker circulate_vertex_cw() const;
HalfEdgeWalker circulate_vertex_ccw() const;
HalfEdgeWalker circulate_face_cw() const;
HalfEdgeWalker circulate_face_ccw() const;
bool full_circle() const;
IndexType no_steps() const;
VertexID vertex() const;
FaceID face() const;
HalfEdgeID halfedge() const;
HalfEdgeWalker operator =(const HalfEdgeWalker& w);
private:
const ConnectivityKernel* const ck;
HalfEdgeID const last;
HalfEdgeID current;
IndexType counter;
HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current, HalfEdgeID _last, IndexType _counter);
};
inline HalfEdgeWalker::HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current)
: ck(&_ck), current(_current), last(_current), counter(0){}
inline HalfEdgeWalker::HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current, HalfEdgeID _last, IndexType _counter)
: ck(&_ck), current(_current), last(_last), counter(_counter){}
inline HalfEdgeWalker HalfEdgeWalker::next() const
{ return HalfEdgeWalker(*ck, ck->next(current), last, counter + 1); }
inline HalfEdgeWalker HalfEdgeWalker::prev() const
{ return HalfEdgeWalker(*ck, ck->prev(current), last, counter + 1); }
inline HalfEdgeWalker HalfEdgeWalker::opp() const
{ return HalfEdgeWalker(*ck, ck->opp(current), last, counter + 1); }
inline HalfEdgeWalker HalfEdgeWalker::circulate_vertex_cw() const
{ return HalfEdgeWalker(*ck, ck->next(ck->opp(current)), last, counter + 1); }
inline HalfEdgeWalker HalfEdgeWalker::circulate_vertex_ccw() const
{ return HalfEdgeWalker(*ck, ck->opp(ck->prev(current)), last, counter + 1); }
inline HalfEdgeWalker HalfEdgeWalker::circulate_face_cw() const
{ return HalfEdgeWalker(*ck, ck->next(current), last, counter + 1); }
inline HalfEdgeWalker HalfEdgeWalker::circulate_face_ccw() const
{ return HalfEdgeWalker(*ck, ck->prev(current), last, counter + 1); }
inline bool HalfEdgeWalker::full_circle() const
{ return (counter > 0 && current == last) ? true : false; }
inline IndexType HalfEdgeWalker::no_steps() const
{ return counter; }
inline VertexID HalfEdgeWalker::vertex() const
{ return ck->vert(current); }
inline FaceID HalfEdgeWalker::face() const
{ return ck->face(current); }
inline HalfEdgeID HalfEdgeWalker::halfedge() const
{ return current; }
inline HalfEdgeWalker HalfEdgeWalker::operator =(const HalfEdgeWalker& w)
{
current = w.current;
counter = w.counter;
return *this;
}
}
#endif