better uniform naming for detach attach functions (now there is FFAttach, FFAttachManifold, FFDetach, etc)

changed SharedVertex into FindSharedVertex
added FindSharedEdge
This commit is contained in:
Paolo Cignoni 2012-07-27 12:59:27 +00:00
parent 500a478e14
commit 2aa57698ad
1 changed files with 85 additions and 47 deletions

View File

@ -238,7 +238,7 @@ void FFDetach(FaceType & f, const int e)
@param z2 The edge of the face f2
*/
template <class FaceType>
void Attach(FaceType * &f, int z1, FaceType *&f2, int z2)
void FFAttach(FaceType * &f, int z1, FaceType *&f2, int z2)
{
//typedef FEdgePosB< FACE_TYPE > ETYPE;
Pos< FaceType > EPB(f2,z2);
@ -261,6 +261,35 @@ void Attach(FaceType * &f, int z1, FaceType *&f2, int z2)
TEPB.f->FFi(TEPB.z) = z1prec;
}
/** This function attach the face (via the edge z1) to another face (via the edge z2).
It is not possible to use it also in non-two manifold situation.
The function cannot be applicated if the adjacencies among faces aren't define.
@param z1 Index of the edge
@param f2 Pointer to the face
@param z2 The edge of the face f2
*/
template <class FaceType>
void FFAttachManifold(FaceType * &f1, int z1, FaceType *&f2, int z2)
{
assert(IsBorder<FaceType>(*f1,z1));
assert(IsBorder<FaceType>(*f2,z2));
assert(f1->V0(z1) == f2->V0(z2) || f1->V0(z1) == f2->V1(z2));
assert(f1->V1(z1) == f2->V0(z2) || f1->V1(z1) == f2->V1(z2));
f1->FFp(z1) = f2;
f1->FFi(z1) = z2;
f2->FFp(z2) = f1;
f2->FFi(z2) = z1;
}
// This one should be called only on uniitialized faces.
template <class FaceType>
void FFSetBorder(FaceType * &f1, int z1)
{
assert(f1->FFp(z1)==0 || IsBorder(*f1,z1));
f1->FFp(z1)=f1;
f1->FFi(z1)=z1;
}
template <class FaceType>
void AssertAdj(FaceType & f)
@ -273,15 +302,6 @@ void AssertAdj(FaceType & f)
assert(f.FFp(1)->FFi(f.FFi(1))==1);
assert(f.FFp(2)->FFi(f.FFi(2))==2);
}
// Funzione di supporto usata da swap?
//template <class FaceType>
//inline void Nexts( *&f, int &z )
//{
// int t;
// t = z;
// z = (*f).Z(z);
// f = (*f).F(t);
//}
/**
* Check if the given face is oriented as the one adjacent to the specified edge.
@ -611,42 +631,42 @@ void VFStarVF( typename FaceType::VertexType* vp, std::vector<FaceType *> &faceV
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
*
*/
template <class FaceType>
static void VFOrderedStarVF_FF(typename FaceType::VertexType &vp,
std::vector<FaceType*> &faceVec)
{
///check that is not on border..
assert (!vp.IsB());
///get first face sharing the edge
FaceType *f_init=vp.VFp();
int edge_init=vp.VFi();
///and initialize the pos
vcg::face::Pos<FaceType> VFI(f_init,edge_init);
bool complete_turn=false;
do
{
FaceType *curr_f=VFI.F();
faceVec.push_back(curr_f);
int curr_edge=VFI.E();
///assert that is not a border edge
assert(curr_f->FFp(curr_edge)!=curr_f);
///continue moving
VFI.FlipF();
VFI.FlipE();
FaceType *next_f=VFI.F();
///test if I've finiseh with the face exploration
complete_turn=(next_f==f_init);
/// or if I've just crossed a mismatch
}while (!complete_turn);
}
template <class FaceType>
static void VFOrderedStarVF_FF(typename FaceType::VertexType &vp,
std::vector<FaceType*> &faceVec)
{
///check that is not on border..
assert (!vp.IsB());
///get first face sharing the edge
FaceType *f_init=vp.VFp();
int edge_init=vp.VFi();
///and initialize the pos
vcg::face::Pos<FaceType> VFI(f_init,edge_init);
bool complete_turn=false;
do
{
FaceType *curr_f=VFI.F();
faceVec.push_back(curr_f);
int curr_edge=VFI.E();
///assert that is not a border edge
assert(curr_f->FFp(curr_edge)!=curr_f);
///continue moving
VFI.FlipF();
VFI.FlipE();
FaceType *next_f=VFI.F();
///test if I've finiseh with the face exploration
complete_turn=(next_f==f_init);
/// or if I've just crossed a mismatch
}while (!complete_turn);
}
/*!
@ -695,15 +715,33 @@ int CountSharedVertex(FaceType *f0,FaceType *f1)
* ;
*/
template <class FaceType>
bool SharedVertex(FaceType *f0,FaceType *f1, int &i, int &j)
bool FindSharedVertex(FaceType *f0,FaceType *f1, int &i, int &j)
{
for (i=0;i<3;i++)
for (j=0;j<3;j++)
if (f0->V(i)==f1->V(j)) return true;
i=-1;j=-1;
return false;
}
/*!
* find the first shared edge between two faces.
* \param f0,f1 the two face to be checked
* \param i,j the indexes of the shared edge in the two faces. Meaningful only if there is a shared edge
*
*/
template <class FaceType>
bool FindSharedEdge(FaceType *f0,FaceType *f1, int &i, int &j)
{
for (i=0;i<3;i++)
for (j=0;j<3;j++)
if( ( f0->V0(i)==f1->V0(j) || f0->V0(i)==f1->V1(j) ) &&
( f0->V1(i)==f1->V0(j) || f0->V1(i)==f1->V1(j) ) )
return true;
i=-1;j=-1;
return false;
}
/*@}*/
} // end namespace