Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
511 s042372 1
/*
2
* Written by Christian Thode Larsen 2009-2010
3
* Contact: thode2d@gmail.com
4
* Based on original work by J. Andreas Baerentzen
5
* Inspired by OpenMesh (www.openmesh.org)
6
*/
7
 
8
#ifndef __HMESH_HALFEDGEWALKER_H__
9
#define __HMESH_HALFEDGEWALKER_H__
10
 
11
#include "ConnectivityKernel.h"
12
 
13
namespace HMesh
14
{
15
	class HalfEdgeWalker
16
	{
17
	public:
18
		HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current);
19
 
20
		HalfEdgeWalker next() const;
21
		HalfEdgeWalker prev() const;
22
		HalfEdgeWalker opp() const;
23
 
24
		HalfEdgeWalker circulate_vertex_cw() const;
25
		HalfEdgeWalker circulate_vertex_ccw() const;
26
 
27
		HalfEdgeWalker circulate_face_cw() const;
28
		HalfEdgeWalker circulate_face_ccw() const;
29
 
30
		bool full_circle() const;
31
		IndexType no_steps() const;
32
 
33
		VertexID vertex() const; 
34
		FaceID face() const; 
35
		HalfEdgeID halfedge() const;
36
 
37
		HalfEdgeWalker operator =(const HalfEdgeWalker& w);
38
 
39
	private:
40
		const ConnectivityKernel* const ck;
41
		HalfEdgeID const last;
42
		HalfEdgeID current;
43
		IndexType counter;
44
 
45
		HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current, HalfEdgeID _last, IndexType _counter);
46
	};
47
 
48
	inline HalfEdgeWalker::HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current) 
49
		: ck(&_ck), current(_current), last(_current), counter(0){}
50
 
51
	inline HalfEdgeWalker::HalfEdgeWalker(const ConnectivityKernel& _ck, HalfEdgeID _current, HalfEdgeID _last, IndexType _counter)
52
		: ck(&_ck), current(_current), last(_last), counter(_counter){}
53
 
54
	inline HalfEdgeWalker HalfEdgeWalker::next() const
55
	{ return HalfEdgeWalker(*ck, ck->next(current), last, counter + 1); }
56
 
57
	inline HalfEdgeWalker HalfEdgeWalker::prev() const
58
	{ return HalfEdgeWalker(*ck, ck->prev(current), last, counter + 1); }
59
 
60
	inline HalfEdgeWalker HalfEdgeWalker::opp() const
61
	{ return HalfEdgeWalker(*ck, ck->opp(current), last, counter + 1); }
62
 
63
	inline HalfEdgeWalker HalfEdgeWalker::circulate_vertex_cw() const
64
	{ return HalfEdgeWalker(*ck, ck->next(ck->opp(current)), last, counter + 1); }
65
 
66
	inline HalfEdgeWalker HalfEdgeWalker::circulate_vertex_ccw() const
67
	{ return HalfEdgeWalker(*ck, ck->opp(ck->prev(current)), last, counter + 1); }
68
 
69
	inline HalfEdgeWalker HalfEdgeWalker::circulate_face_cw() const
70
	{ return HalfEdgeWalker(*ck, ck->next(current), last, counter + 1); }
71
 
72
	inline HalfEdgeWalker HalfEdgeWalker::circulate_face_ccw() const
73
	{ return HalfEdgeWalker(*ck, ck->prev(current), last, counter + 1); }
74
 
75
	inline bool HalfEdgeWalker::full_circle() const
76
	{ return (counter > 0 && current == last) ? true : false; }
77
 
78
	inline IndexType HalfEdgeWalker::no_steps() const
79
	{ return counter; }
80
 
81
	inline VertexID HalfEdgeWalker::vertex() const
82
	{ return ck->vert(current); }
83
 
84
	inline FaceID HalfEdgeWalker::face() const
85
	{ return ck->face(current); }
86
 
87
	inline HalfEdgeID HalfEdgeWalker::halfedge() const
88
	{ return current; }
89
 
90
	inline HalfEdgeWalker HalfEdgeWalker::operator =(const HalfEdgeWalker& w)
91
	{ 
92
		current = w.current;
93
		counter = w.counter;
94
		return *this;
95
	}
96
 
97
}
98
 
99
#endif