File: halfedge_pos.h

package info (click to toggle)
meshlab 1.3.2%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 21,096 kB
  • ctags: 33,630
  • sloc: cpp: 224,813; ansic: 8,170; xml: 119; makefile: 80
file content (160 lines) | stat: -rw-r--r-- 3,744 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#ifndef VCG_HEDGE_POS
#define VCG_HEDGE_POS

namespace vcg
{
    namespace hedge
    {
        /*!
          * \brief Class implementing a Pos using halfedges
          *
          */
        template <class MeshType> class Pos
        {

        public:

            typedef typename MeshType::VertexPointer VertexPointer;
            typedef typename MeshType::EdgePointer EdgePointer;
            typedef typename MeshType::HEdgePointer HEdgePointer;
            typedef typename MeshType::FacePointer FacePointer;

            /*!
             * Halfedge used to move in the mesh
             */
            HEdgePointer he;

            /*!
             * Direction of movement:
             *
             * 0 = clockwise
             *
             * 1 = counter-clockwise
             */
            bool direction;

            /*!
             *
             */
            Pos(HEdgePointer hep, bool dir)
            {
                he = hep;
                direction = dir;
            }

            /*!
             *
             */
            Pos(HEdgePointer hep)
            {
                he = hep;
                direction = 1;
            }

            /*!
             * Changes vertex mantaininge the same edge and the same face
             */
            void FlipV()
            {
                direction = !direction;
            }

            /*!
             * Changes edge and hedge mantaining the same vertex and the same face
             */
            void FlipE()
            {
                if(!direction)
                    he = he->HNp();
                else
                    if(he->HasHPrevAdjacency())
                        he = he->HPp();
                    else
                    {
                        HEdgePointer aux = he;
                        while(aux->HNp() != he)
                            aux = aux->HNp();
                        he = aux;
                    }

                direction = !direction;
            }

            /*!
             * Changes face mantaininge the same vertex and the same edge
             */
            void FlipF()
            {
                direction = !direction;
                he = he->HOp();
            }

            /*!
             * Gets pointed vertex
             */
            VertexPointer V()
            {
                if(direction)
                    return he->HVp();
                else
                    return he->HOp()->HVp();
            }

			/*!
             * Gets opposite vertex
             */
            VertexPointer Vo()
            {
                if(!direction)
                    return he->HVp();
                else
                    return he->HOp()->HVp();
            }
			
            /*!
             * Gets pointed hedge
             */
            HEdgePointer HE()
            {
                return he;
            }

            /*!
             * Gets pointed edge
             */
            EdgePointer E()
            {
                return he->HEp();
            }

            /*!
             * Gets pointed face
             */
            FacePointer F()
            {
                return he->HFp();
            }

            /*!
             * Operator to check if two Pos are equal
             */
            inline bool operator == ( Pos const & p ) const
            {
                return (he == p.he && direction == p.direction);
            }

            /*!
             * Operator to check if two Pos are different
             */
            inline bool operator != ( Pos const & p ) const
            {
                return (he != p.he || direction != p.direction);
            }

        };

    }
}

#endif // VCG_HEDGE_POS