Significant changes of interface of VFOrderedStarFF (that substitute two very similar VFOrderedStarFF_VF)
Added EFStarFF
This commit is contained in:
parent
9cea19e537
commit
feb77d945a
|
@ -582,7 +582,8 @@ void VFAppend(FaceType* & f, int z)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Compute the set of vertices adjacent to a given vertex using VF adjacency.
|
* \brief Compute the set of vertices adjacent to a given vertex using VF adjacency
|
||||||
|
*
|
||||||
* \param vp pointer to the vertex whose star has to be computed.
|
* \param vp pointer to the vertex whose star has to be computed.
|
||||||
* \param starVec a std::vector of Vertex pointer that is filled with the adjacent vertices.
|
* \param starVec a std::vector of Vertex pointer that is filled with the adjacent vertices.
|
||||||
*
|
*
|
||||||
|
@ -606,27 +607,10 @@ void VVStarVF( typename FaceType::VertexType* vp, std::vector<typename FaceType:
|
||||||
starVec.resize(new_end-starVec.begin());
|
starVec.resize(new_end-starVec.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* Compute the set of faces adjacent to a given vertex using VF adjacency.
|
|
||||||
* \param vp pointer to the vertex whose star has to be computed.
|
|
||||||
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
template <class FaceType>
|
|
||||||
void VFStarVF( typename FaceType::VertexType* vp, std::vector<FaceType *> &faceVec)
|
|
||||||
{
|
|
||||||
typedef typename FaceType::VertexType* VertexPointer;
|
|
||||||
faceVec.clear();
|
|
||||||
face::VFIterator<FaceType> vfi(vp);
|
|
||||||
while(!vfi.End())
|
|
||||||
{
|
|
||||||
faceVec.push_back(vfi.F());
|
|
||||||
++vfi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Compute the set of faces adjacent to a given vertex using VF adjacency.
|
* \brief Compute the set of faces adjacent to a given vertex using VF adjacency.
|
||||||
|
*
|
||||||
* \param vp pointer to the vertex whose star has to be computed.
|
* \param vp pointer to the vertex whose star has to be computed.
|
||||||
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
|
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
|
||||||
* \param indexes a std::vector of integer of the vertex as it is seen from the faces
|
* \param indexes a std::vector of integer of the vertex as it is seen from the faces
|
||||||
|
@ -638,6 +622,7 @@ void VFStarVF( typename FaceType::VertexType* vp,
|
||||||
{
|
{
|
||||||
typedef typename FaceType::VertexType* VertexPointer;
|
typedef typename FaceType::VertexType* VertexPointer;
|
||||||
faceVec.clear();
|
faceVec.clear();
|
||||||
|
indexes.clear();
|
||||||
face::VFIterator<FaceType> vfi(vp);
|
face::VFIterator<FaceType> vfi(vp);
|
||||||
while(!vfi.End())
|
while(!vfi.End())
|
||||||
{
|
{
|
||||||
|
@ -648,6 +633,36 @@ void VFStarVF( typename FaceType::VertexType* vp,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Compute the set of faces incident onto a given edge using FF adjacency.
|
||||||
|
*
|
||||||
|
* \param fp pointer to the face whose star has to be computed
|
||||||
|
* \param ei the index of the edge
|
||||||
|
* \param faceVec a std::vector of Face pointer that is filled with the faces incident on that edge.
|
||||||
|
* \param indexes a std::vector of integer of the edge position as it is seen from the faces
|
||||||
|
*/
|
||||||
|
template <class FaceType>
|
||||||
|
void EFStarFF( FaceType* fp, int ei,
|
||||||
|
std::vector<FaceType *> &faceVec,
|
||||||
|
std::vector<int> &indVed)
|
||||||
|
{
|
||||||
|
assert(fp->FFp(ei)!=0);
|
||||||
|
faceVec.clear();
|
||||||
|
indVed.clear();
|
||||||
|
FaceType* fpit=fp;
|
||||||
|
int eit=ei;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
faceVec.push_back(fpit);
|
||||||
|
indVed.push_back(eit);
|
||||||
|
FaceType *new_fpit = fpit->FFp(eit);
|
||||||
|
int new_eit = fpit->FFi(eit);
|
||||||
|
fpit=new_fpit;
|
||||||
|
eit=new_eit;
|
||||||
|
} while(fpit != fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Compute the set of faces adjacent to a given vertex using VF adjacency.
|
* Compute the set of faces adjacent to a given vertex using VF adjacency.
|
||||||
* The set is faces is extended of a given number of step
|
* The set is faces is extended of a given number of step
|
||||||
|
@ -687,91 +702,35 @@ static void VFExtendedStarVF(typename FaceType::VertexType* vp,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Compute the ordered set of faces adjacent to a given vertex using VF adjacency.and FF adiacency
|
* Compute the ordered set of faces adjacent to a given vertex using FF adiacency
|
||||||
* \param vp pointer to the vertex whose star has to be computed.
|
* \param startPos a Pos<FaceType> indicating the vertex whose star has to be computed.
|
||||||
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
|
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
|
||||||
|
* \param edgeVec a std::vector of indexes filled with the indexes of the corresponding edges shared between the faces.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
template <class FaceType>
|
template <class FaceType>
|
||||||
static void VFOrderedStarVF_FF(const typename FaceType::VertexType &vp,
|
static void VFOrderedStarFF(Pos<FaceType> &startPos,
|
||||||
std::vector<FaceType*> &faceVec)
|
std::vector<FaceType*> &faceVec,
|
||||||
|
std::vector<int> &edgeVec)
|
||||||
{
|
{
|
||||||
|
bool foundBorder=false;
|
||||||
|
Pos<FaceType> curPos=startPos;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
assert(curPos.IsManifold());
|
||||||
|
if(curPos.IsBorder()) foundBorder=true;
|
||||||
|
|
||||||
///check that is not on border..
|
faceVec.push_back(curPos.F());
|
||||||
assert (!vp.IsB());
|
edgeVec.push_back(curPos.E());
|
||||||
|
curPos.FlipF();
|
||||||
///get first face sharing the edge
|
curPos.FlipE();
|
||||||
FaceType *f_init=vp.cVFp();
|
} while(curPos!=startPos);
|
||||||
int edge_init=vp.cVFi();
|
if(foundBorder)
|
||||||
|
{
|
||||||
///and initialize the pos
|
assert((faceVec.size()%2)==0); // if we found a border we visited each face exactly twice.
|
||||||
vcg::face::Pos<FaceType> VFI(f_init,edge_init);
|
faceVec.resize(faceVec.size()/2);
|
||||||
bool complete_turn=false;
|
edgeVec.resize(edgeVec.size()/2);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Compute the ordered set of faces adjacent to a given vertex using VF adjacency.and FF adiacency
|
|
||||||
* \param vp pointer to the vertex whose star has to be computed.
|
|
||||||
* \param faceVec a std::vector of Face pointer that is filled with the adjacent faces.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
template <class FaceType>
|
|
||||||
static void VFOrderedStarVF_FF(const typename FaceType::VertexType &vp,
|
|
||||||
std::vector<FaceType*> &faceVec,
|
|
||||||
std::vector<int> &edgeVec)
|
|
||||||
{
|
|
||||||
|
|
||||||
///check that is not on border..
|
|
||||||
assert (!vp.IsB());
|
|
||||||
|
|
||||||
///get first face sharing the edge
|
|
||||||
FaceType *f_init=vp.cVFp();
|
|
||||||
int edge_init=vp.cVFi();
|
|
||||||
|
|
||||||
///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();
|
|
||||||
edgeVec.push_back(curr_edge);
|
|
||||||
///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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
Loading…
Reference in New Issue