Subversion Repositories gelsvn

Rev

Rev 512 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* Written by Christian Thode Larsen 2009-2010
* Contact: thode2d@gmail.com
* Based on original work by J. Andreas Baerentzen
* Inspired by OpenMesh (www.openmesh.org)
*/

#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