Subversion Repositories gelsvn

Rev

Rev 511 | Rev 518 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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