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
|